簡體   English   中英

多線程和共享對象

[英]Multi threading and shared object

如果我有一個像這樣的課程:

class MultiThreadEg {

private Member member;

public Integer aMethod() {
    ..............
    ..............
}

public String aThread() {
    ...............
    member.memberMethod(.....);
    Payment py = member.payment();
    py.processPayment();
    ...........................
}

}

假設aThread()是一個新線程,那么,同時訪問太多線程的共享成員對象是否會引起任何問題(使用以下訪問規則)?

Rule 1 : ONLY reading, no writing to the object(member).
Rule 2 : For all the objects that need some manipulation(writing/modification), a copy of the original object will be created.

例如:在payment()方法中,我這樣做:

public class Member {

private Payment memPay;

public payment() {
   Payment py = new Payment(this.memPay);//Class's Object copy constructor will be called.
   return py;
}

}

我擔心的是,即使我創建了用於“寫入”的對象副本(例如在payment()方法中),但同時通過太多線程訪問成員對象仍會引起一些差異。

事實是什么? 此實現在每種情況下(0個或多個並發訪問)是否可靠? 請指教。 謝謝。

您可以簡單地使用ReentrantReadWriteLock 這樣,您可以讓多個線程同時讀取,而不會出現問題,但是只允許一個線程修改數據。 Java為您處理並發。

 ReadWriteLock rwl = new ReentrantReadWriteLock();
 Lock readLock = rwl.readLock;
 Lock writeLock = rwl.writeLock;

 public void read() {

    rwl.readLock.lock();
    try {
       // Read as much as you want.
    } finally {
       rwl.readlock.unlock();
    }
 }

 public void writeSomething() {
    rwl.writeLock.lock();
    try {
       // Modify anything you want
    } finally {
       rwl.writeLock.unlock();
    }
 }

請注意,您應該在try塊開始之前將lock()鎖定 ,以確保甚至在啟動之前就已經獲得了鎖定。 並且,將unlock()放在finally子句中可以確保,無論try內發生了什么(提早返回,拋出異常等),該鎖都會被釋放。

如果要更新memPay取決於memPay內容(例如memPay.amount + = 100),則在更新時應阻止對其他線程的訪問。 看起來像:

mutual exclusion block start
get copy
update copy
publish copy
mutual exclusion block end

否則,當兩個線程同時開始更新memPay對象時,更新可能會丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM