- Java多線程編程實戰指南:設計模式篇(第2版)
- 黃文海
- 524字
- 2021-10-15 19:24:56
3.6 Java標準庫實例
在多線程環境中,當遍歷一個集合(Collection,如java.util.Vector)對象時,即便被遍歷的對象本身是線程安全的,開發人員仍然不得不引入鎖,以防止遍歷過程中該集合的內部結構被其他線程改變(如刪除或者添加了一個新的元素)而導致出錯,如清單3-7所示。
清單3-7 遍歷線程安全的集合時加鎖

為了保證線程安全而在遍歷時對集合對象加鎖,但這在某些情況下可能并不合適,比如系統中對該集合的添加和刪除操作的頻率遠比遍歷操作的頻率要高。JDK 1.5中引入的類java.util.concurrent.CopyOnWriteArrayList應用了Immutable Object模式,使得對CopyOnWriteArrayList實例進行遍歷時不用加鎖也能保證線程安全。當然,CopyOnWriteArrayList也不是“萬能”的,它是專門針對遍歷操作比添加和刪除操作更加頻繁的場景設計的。CopyOnWriteArrayList的源代碼(骨架)如清單3-8所示。
清單3-8 JDK類CopyOnWriteArrayList的源代碼(骨架)

從清單3-8中的代碼可見,CopyOnWriteArrayList的內部維護了一個名為array的實例變量,其用于存儲集合的各個元素。在集合中添加一個元素的時候,CopyOnWriteArrayList會生成一個新的數組,并將集合中現有的元素都復制給新的數組,然后將新的數組的最后一個元素設置為要添加的元素。這個新的數組會直接被賦值給array實例變量。在這里,實例變量array引用的數組就是一個等效的不可變對象[2],其內容一旦確定下來就不再改變。因此,在遍歷CopyOnWriteArrayList以維護各個元素的時候,直接根據array實例變量生成一個Iterator實例即可,無須加鎖[3]。
- 大學計算機基礎(第二版)
- iOS 9 Game Development Essentials
- 我的第一本算法書
- Data Analysis with IBM SPSS Statistics
- 精通Linux(第2版)
- Visual FoxPro程序設計習題集及實驗指導(第四版)
- Statistical Application Development with R and Python(Second Edition)
- Couchbase Essentials
- 零基礎看圖學ScratchJr:少兒趣味編程(全彩大字版)
- 大學計算機應用基礎(Windows 7+Office 2010)(IC3)
- 高質量程序設計指南:C++/C語言
- 少年小魚的魔法之旅:神奇的Python
- C語言解惑:指針、數組、函數和多文件編程
- 瘋狂Ajax講義(第3版)
- 瘋狂Java講義精粹