[英]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.