簡體   English   中英

應該在列表本身還是在鎖定對象上同步?

[英]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()是訪問列表的唯一方法,則第一種情況是安全的。 來自不同流的任何其他線程都可以修改實際列表。

第二種情況鎖定實際列表實例,因此,始終保證一次只有一個線程訪問/修改列表。

只要您的鎖定Objectfinal ,兩者在安全性方面都是等效的。 如果在代碼中的多個類上訪問它,則可能更容易鎖定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM