Javaは、通常、最も使用される地図HashMapのコレクションであり、それは、スレッドセーフです。
次の2つのシナリオを見てください:
1、現在のスレッドレベルの変数に属するローカル変数の方法で使用されるローカル変数は、他のスレッドがアクセスすることができない、何のスレッドセーフな不安の問題はありませんので、とき。
それのための時間のシングルトンオブジェクトのメンバ変数で使用される2、?複数のスレッドがHashMapをアクセスする上で、この時間は同じであり、この時間は、操作のHashMapを持つスレッドの安全性の問題があります。
スレッドセーフな地図
スレッドセーフな地図はスレッドセーフ2つの問題を回避するために、現場でそれを要約するために何を持っている、あなたは、以下のスレッドセーフな地図を使用することを求めて、メンバ変数としてHashMapを使用することはできませんか?
1、ハッシュテーブル
プライベート地図<文字列、オブジェクト>マップ=新しいHashtableの<>();
ソースコードのハッシュテーブルを見てみましょう
GET / PUTメソッドのハッシュテーブルは、それらがメソッドレベルをブロックしていることを示す、キーワードを同期修飾され、それらが一つだけスレッドが取得または入れ、取得同時に操作で得られた、共有リソースのロックを占める/操作を同時に行うことができない置くので、これを同期の種子収集効率が非常に低く、一般的に我々は、このコレクションの使用はお勧めしません。
2、SynchronizedMap
プライベート地図<文字列、オブジェクト>マップ= Collections.synchronizedMap(新しいHashMapの<文字列、オブジェクト>());
これは、メソッド内SynchronizedMapを作成するために直接使用するツールで、HashMapのオブジェクトが渡されましたが、そのソースコードを見て同期を充填しました。
この同期方法は、達成することは比較的簡単である実装SynchronizedMapは、ロックオブジェクトを追加見ることで、HashMapのそれぞれの動作は、第1入力するミューテックスロックオブジェクトを取得しなければならないので、パフォーマンスはハッシュテーブルに行くよりも良いではありませんお勧めできません。
3、のConcurrentHashMap - 推奨
private Map<String, Object> map = new ConcurrentHashMap<>();
这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每个版本的实现方式也不一样,在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。
虽然实现起来很复杂,但使用起来也是非常简单的,在java面试中问的频率也非常高,最重要的是性能要比上面两种同步方式要快太多,推荐使用。