[英]Java Concurrency Issue
我知道我們可以設計一個地圖,以便使用並發實用程序,它允許單個用戶一次修改地圖數據。 我想知道這種並發行為是否僅適用於put
操作或還專門用於size
操作。 下面的代碼說明了這個問題:
一個線程在這個代碼塊中
if(map.size())
{
//do something
}
而另一個線程在這個塊中
map.put(obj);
我想知道size
操作是否會在put
操作完成之前停止,反之亦然。
簡而言之,是的: size()
必須等待互斥鎖才能執行。 Collections.synchronizedMap(Map)
返回一個由原始地圖支持的SynchronizedMap
。 同步映射的每個公共方法都由一個私有互斥鎖同步。 例如,這里是toString()
方法:
public String toString() {
synchronized (mutex) {return m.toString();}
}
為了保證串行訪問,對支持映射的所有訪問都通過返回的映射完成是至關重要的。
此外,如果您需要手動同步,例如迭代密鑰集:
當迭代任何集合視圖時,用戶必須在返回的 * 地圖上手動同步...如果不遵循此建議可能會導致非確定性行為。
考慮以下示例:
//inside thread1
if(map.size()>n){
//do something
System.out.println(map.size());
}
//inside thread2
map.put(obj);
在這種情況下, map.size()
的if
語句中map.size()
的值不一定等於//do something
塊中map.size()
的打印值。 在這種情況下,您必須在地圖上手動同步:
synchronize(map){
if(map.size()>n){
//do something
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.