[英]should one synchronize on a list itself or on a lock object?
一段時間以來,我腦子里有一個問題:當多個線程有權訪問該列表時,如何同步訪問列表(ArrayList ...)更安全? 在列表本身上同步是否更安全,或者創建鎖定對象並使用它來同步它更安全?
無需自己同步。 集合框架已經做到了。 只要利用它。
List list = Collections.synchronizedList(yourList);
並使用返回的list
。 記住這個方法
返回由指定列表支持的同步(線程安全)列表。
我相信這就是你想要的。 可能有2個案例(最終):
您使用單獨的鎖來同步。
someMethod(){
synchronized(lock){
// code to access/modify List here
}
}
您直接在List實例上同步
synchronized(list)
{
// code to access/modify list here
}
如果someMethod()
是訪問列表的唯一方法,則第一種情況是安全的。 來自不同流的任何其他線程都可以修改實際列表。
第二種情況鎖定實際列表實例,因此,始終保證一次只有一個線程訪問/修改列表。
只要您的鎖定Object
是final
,兩者在安全性方面都是等效的。 如果在代碼中的多個類上訪問它,則可能更容易鎖定List
本身,因此您不必同時傳遞List
和正在同步的Object
。
但是你應該避免所有這些並讓Java使用List<T> list = Collections.synchronizedList(new ArrayList<T>)
來處理同步
只要您始終鎖定對象,這兩個選項或多或少都是等效的。 因此,列表本身的同步可能更沒有錯誤,因為您不會意外地使用“其他對象”進行同步。
如前所述,如果只需要“簡單”同步,你可以使用syncList = Collections.synchronizedList(yourList)
......這將是最安全的方式,但是在更普遍的同步方案中,例如“put-if-absent”是不夠的“等等。例如,以下剪斷是壞的 - 不夠同步:
if (syncList.contains(element)) { syncList.add(element); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.