0

オブジェクトを検索する必要があります。最初に aBlockingQueueを検索し、そこにない場合は a を検索し、ConcurrentHashMap何らかの操作を行う必要があります。これはスレッドセーフである必要があります。

以下のコードは大丈夫ですか?同期はConcurrentHashMap期待どおりに動作しますか?

synchronized(blockingQueue){
   if(!blockingQueue.contains(element)) {        
      synchronized(concurrentHashMap) {    
             //do something
      }
   }
}
4

4 に答える 4

1

前の回答に含まれていなかった重要な説明は、ハッシュ マップをロックsynchronized(concurrentHashMap)、「synchronized(blockingQueue)」はキューをロックせ、同じスレッドで同期されていない他のスレッドで引き続き更新できることです。オブジェクト。

ConcurrentHashMap の javadoc を引用します。

ただし、すべての操作はスレッドセーフですが、取得操作にはロックが必要ではなく、すべてのアクセスを防止する方法でテーブル全体をロックすることはサポートされていません。

//do somethingより良い答えを出すために何をすべきかを知ることは役に立ちます。

于 2013-08-20T08:37:41.867 に答える
0

もっと説明していただけますか?これらのオブジェクトblockingQueueおよびconcurrentHashMapにアクセスしているのは誰ですか。読み取り専用/書き込み専用のスレッドがありますか?

おそらく、java.util.concurrent.locks.ReadWriteLock を見てください。

于 2013-08-20T08:15:23.557 に答える