4

最初に、私が何を望んでいるのかを説明し、次に検討中の可能性について詳しく説明します。どれがいいのかわからないので、どなたか教えていただきたいです。

からの読み取りおよび書き込み操作を行うハッシュマップがありますServlet。これServletは Tomcat 上にあるため、ハッシュ マップをスレッド セーフにする必要があります。基本的に、それが書き込まれているときは、他に何も書き込むべきではなく、何も読み取れないようにする必要があります。

私は見ConcurrentHashMapましたが、その get メソッドがスレッドセーフではないことに気付きました。次に、ロックと同期と呼ばれるものを見てきました。

一番信頼できる方法を知りたいです。

4

5 に答える 5

19

ConcurrentHashMap.get()スレッドセーフです。

HashMapでラップすることで、スレッドセーフにすることができますCollections.synchronizedMap()

于 2013-08-01T16:57:27.597 に答える
4

編集:誤った情報を削除しました

いずれにせよ、synchronizedキーワードは安全な賭けです。ブロック内にある間、スレッドがオブジェクトにアクセスするのをsynchronizedブロックします。

// Anything can modify map at this point, making it not thread safe
map.get(0);

とは対照的に

// Nothing can modify map until the synchronized block is complete
synchronized(map) {
    map.get(0);
}
于 2013-08-01T16:59:46.600 に答える
3

Collections.synchronizedMap(new HashMap<K, V>);

指定されたマップに基づく同期 (スレッドセーフ) マップを返します。シリアル アクセスを保証するには、バッキング マップへのすべてのアクセスが、返されたマップを介して行われることが重要です。

コレクション ビューのいずれかを反復処理する場合、返されたマップでユーザーが手動で同期することが不可欠です。

于 2013-08-01T16:57:16.390 に答える
0

これが ConcurrentHashMap クラスのポイントです。複数のスレッドがある場合、コレクションを保護します。

于 2013-08-01T17:46:18.373 に答える