前言 :
Java 的容器類別 (Collection) 非常好用,常用的 Collection 有 ArrayList, LinkedList, Map, HashMap, Set, HashSet 等, 然而這些類別在設計時並沒有加入執行緒安全(Thread Safe)的功能,所以如果要將這些的好用的類別用在多執行緒的程式環境中就必須自己實作相關的程式, 來確保 Collection 中共用的資料在多執行緒執行時存取不錯出錯.
保護同步物件 :
要達成執行緒安全(Thread Safe) 最簡單的方法就是把共用的物件同步化 (synchronized), 這個方法也常被用於鎖定其他非 Collection 類別物件來保護共用的資料。 使用同步化(synchronized)鎖定 arrayList 的方式如下 :
- ArrayList arrayList = new ArrayList();
- Object object = new Object();
- synchronized(arrayList) {
- arrayList.add(object);
- arrayList.remove(object);
- }
以剛剛的例子,若我們要取得同步化的 ArrayList,就可以使用以下的程式 :
- List arrayList = Collections.synchronizedList(new ArrayList());
- arrayList.add("John");
- arrayList.add("Peter");
- List arrayList = Collections.synchronizedList(new ArrayList());
- arrayList.add("John");
- arrayList.add("Peter");
- synchronized(arrayList) {
- Iterator iterator = arrayList.iterator();
- while (iterator.hasNext()){
- System.out.println(iterator.next());
- }
- }
結論 :
看完了以上的說明,相信大家已經知道同步化可以如何達成,若在需要同步化的情況下,直接利用最新的 java.util.concurrent package 似乎比較簡單,且又可以兼顧效能及安全性,相信這是首選。除了這些新增同步化功能的 Collection 類別外,Java 在很久以前 Vector 就已支援同步化,下面這一篇針對 ArrayList 和 Vector 的適用情況做了很清楚的說明,若不介意看英文,相信會從其間得到許多 : Vector or ArrayList -- which is better?
補充說明 :
* [ Java小學堂 ] 多線程設計模式 : 線程的啟動與暫時停止
* [ Java小學堂 ] 多線程設計模式 : 線程的協調 (wait, notify & notifyAll)
* [ Java小學堂 ] 多線程設計模式 : 線程的共享互斥與synchronized 介紹
沒有留言:
張貼留言