簡體   English   中英

Java並發問題

[英]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.

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