我有一個多線程應用程序使用提供列表的單個靜態類。我希望靜態類的getters能夠自由地工作(不同步),但是當setter工作時,我希望所有getter都被鎖定,並等待setter的工作完成。我不想鎖定getter,因爲它們會降低性能。吸氣劑每天被稱爲1,000,000次,吸氣器只應該每天工作一次。如何在setter在Java中工作時同步getter
回答
考慮使用java.util.concurrent.locks.ReadWriteLock
實現,如ReentrantReadWriteLock
(見javadoc)
甲
ReadWriteLock
維護一對相關的鎖,一個用於只讀操作,另一個用於寫入的。只要沒有寫入器,讀取鎖可以由多個讀取器線程同時保存。寫鎖定是獨佔的。
你會用這個而不是。你的獲得者將獲得讀鎖,然後在他們返回時釋放,例如,
public String getX() {
Lock readLock = readWriteLock.readLock();
readLock.lock();
try {
return value;
} finally {
readLock.unlock();
}
}
同樣對於setter方法,只是用readWriteLock.writeLock()
來代替。
該類將有一個單獨的ReentrantReadWriteLock
對象,由每個對象上的所有getter和setter共享(或者,如果願意,每個getter/setter對都有)。
這非常麻煩,但應該給予很好的併發性。由於這些原因,如果你真的需要它,你只應該採取這種方式,這意味着如果你只使用vanilla同步,就會測量你得到的降級併發性。
偉大的方法,謝謝 –
您的設置人員可以在每次更新時獲取數據的副本,並且獲得者可以使用副本。這對於制定者來說可能非常昂貴,但對吸氣者的影響最小。
然而,同步鎖可能在25到100納秒的順序。即使您每分鐘調用一次同步方法一百萬次,也不會增加足夠的延遲時間。每秒一百萬,肯定會。
好吧,那麼如果延遲順序爲ns我不介意只是同步所有的方法。感謝您的信息。 –
您的第二段似乎不相關。 OP似乎並不擔心'synchronized'本身的開銷;相反,他只是不希望調用getter必須是順序的。 (我認爲你是對的,他不應該擔心;但不擔心的是吸氣劑應該是非常快速和便宜的,不是因爲「同步」。) – ruakh
'synchronized'的成本通常遠高於調用getter的方法。如果你的吸氣器比這更昂貴,它不是一個常規的吸氣劑。 –
我會先同步所有訪問,並且只有在證明是性能問題時才進行優化。
要優化,可以使用CopyOnWriteArrayList或ReadWriteLock。如果不更準確地瞭解上下文,就很難給出明確的解決方案。
這是使用CopyOnWriteArrayList的原型案例。
「這通常代價太高,但在遍歷操作數量大大超過突變時可能會比替代方法更有效,而且當您不能或不想同步遍歷,但需要排除併發線程之間的干擾時,它非常有用。
- 1. Java。如何正確同步getter和setter?
- 2. getter和setter如何在PHP中工作
- 3. 在Java中如何同步工作
- 4. 如何在2中使用getter和setter方法不同java fila
- 5. getter和setter在
- 6. 在java中使用Getter和Setter for arraylist
- 7. 在java中使用ArrayList的getter和setter
- 8. 如何在c#中使getter&Setter屬性異步?
- 9. Java中的Getter和Setter
- 10. 同名的Getter/Setter
- 11. getter上的volatile和setter上的同步與synchronized上的同步?
- 12. 在類中使用getter-setter
- 13. Java getter和setter不起作用
- 14. 在JavaScript getter/setter中使用delete刪除getter/setter
- 15. 如何在不同的功能中使用setter和getter?
- 16. Getter和setter在recyclerview中無法正常工作android
- 17. Java setter,getter(滾動模具)
- 18. 如何測試setter和getter?
- 19. 同步靜態方法在Java中如何工作?
- 20. 製作int的getter/setter?
- 21. getter和setter方法在WCF
- 22. java在方法上同步不工作?
- 23. 得到錯誤,同時具有getter和setter在科特林
- 24. Javascript的URL()構造函數如何在幕後工作(getter/setter怪異)
- 25. getter和setter C++
- 26. Objective-C getter/setter
- 27. Soap Setter Getter android
- 28. Synchronzied Getter和Setter
- 29. Getter setter差異
- 30. Getter和Setter在Android中返回null
狀態變量? – Kris