官术网_书友最值得收藏!

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]。

主站蜘蛛池模板: 建宁县| 开平市| 启东市| 吉林市| 灌云县| 安远县| 林周县| 潮州市| 理塘县| 余江县| 如东县| 汉寿县| 怀远县| 和田县| 孝义市| 高唐县| 鄂温| 武功县| 城固县| 清河县| 昌江| 额尔古纳市| 灵宝市| 沂南县| 临夏市| 阜南县| 攀枝花市| 稷山县| 西畴县| 资中县| 濉溪县| 张掖市| 南召县| 安国市| 白银市| 天峨县| 凭祥市| 东至县| 灵寿县| 海兴县| 汽车|