2013-08-20 63 views
2

我想知道有什麼區別同步的Java同步容器VS對象

List<Integer> intList = Collections.synchronizedList(new ArrayList<Integer>()); 

synchronized (intList) { 
    //Stuff 
} 

的這些方式之間和使用對象鎖定

Object objectLock = new Object(); 

List<Integer> intList = new ArrayList<Integer>(); 

synchronized (objectLock) { 
    //Stuff 
} 

回答

6

第一種方法可以確保各個方法調用同步,並且它避免了需要管理單獨的鎖對象。一個線程可以調用

intList.add(3); 

,另一個可以調用

intList.clear(); 

沒有​​塊,它會被正確地同步。 (不幸的是,當你需要保持一組函數調用的鎖時,這不起作用;然後,這些調用需要一個​​塊。)另外,如果需要通過列表,可以使用

otherObject.doStuffWith(intList); 

return intList; 

代替

otherObject.doStuffWith(intList, objectLock); 

return ListAndLock(intList, objectLock); 
+0

謝謝,回答我的問題 – user2686811

0

您顯示的代碼不一定是線程安全的!

一個摘錄和另一個摘錄之間的唯一區別是您用作同步監視器的對象。這種差異將決定應該由需要訪問的可變數據,你要保護

爲這個偉大的讀取其他線程用於同步哪個對象:java concurrency in practice

+0

謝謝,我會給它一個閱讀 – user2686811