この記事の主な研究は、次のようにConcurrentMap.putIfAbsent(key,value)の使用に関連するコンテンツです。
この種のシナリオは、多くの場合、ビジネスで遭遇します。同時コンカレントマップはグローバルに維持されます。マップの各キーはオブジェクトに対応し、このオブジェクトは1回だけ作成する必要があります。マップ内のキーに対応する値が存在しない場合、作成されます。そうしないと、直接返されます。
最初にコードを見てみましょう:
public static locale getInstance(String Language、String Country、String Variant){// ...文字列キー= some_string; locale locale = map.get(key); if(locale == null){locale = new locale(言語、国、バリアント); map.put(key、locale); } return locale; }このコードがする必要があることは次のとおりです。
GetInstanceメソッドが呼び出されるたびに、同じキーが同じローカルオブジェクト参照を返すことを確認する必要があると予想されます。このコードはこの要件を達成できますか?
答えは次のとおりです。単一スレッド環境では要件を満たすことができますが、マルチスレッド環境ではスレッドの安全性の問題があります。つまり、同時の同じキーが同じローカルオブジェクト参照を返すことを保証することはできません。
これは、上記のコードにPut-if-absent操作[1]と呼ばれる習慣があるためです。この操作には人種条件があります。
if(locale == null){locale = new locale(言語、国、バリアント); map.put(key、locale); }スレッドがlocale == nullの判断が終了した後、マップに値を入れることは真実であるためです。他のスレッドは、すでに操作をマップ上に置いている可能性があります。再度操作を行うと、同じキーに対応するロケールオブジェクトが上書きされ、最後にGetInstanceメソッドによって返される同じキーのロケール参照が一貫しません。したがって、マップ上の任意の操作は安全ではありません(スレッドは安全です)。
この問題を解決するために、Java 5.0は同時マップインターフェイスを導入しました。ここでは、Put-If-absent操作が原子法のputIfAbsent(K key, V value)の形で存在します。 Javadocが書いているように:
CONCURRENTHASHMAPにキー値ペアを追加すると、最初にキー値ペアがすでに存在するかどうかを判断します。
上記の方法を修正します。
public static locale getInstance(String Language、String Country、String Variant){// ...文字列キー= some_string; locale locale = map.get(key); if(locale == null){locale = new locale(言語、国、バリアント); map.putifabsent(key、locale); } return locale; }このコードは、MAPの同時形式(CONCURRENTMAP、CONCURRENTHASHMAP)を使用し、ステートメントmap.putIfAbsent(key, locale)単純に使用します。これはまた、同じキーが同じロケールオブジェクトリファレンスを返すことを保証するものではありません。
ここでのエラーは、prentifabsentメソッドに戻り値があり、返品値が重要であることです。
したがって、putifabsentメソッドを使用する場合は、返品値を判断することを忘れないでください。
public static locale getInstance(String Language、String Country、String Variant){// ...文字列キー= some_string; locale locale = map.get(key); if(locale == null){locale = new locale(言語、国、バリアント); locale tmp = map.putifabsent(key、locale); if(tmp!= null){locale = tmp; }} return locale; } java.util.map; Import java.util.concurrent.concurrenthashmap; public static void main(string [] args){// currenthashmap.putifabsent()map <long、string> clientmap = new concurrenthashmap <>( first "); system.out.println(" clientmap: " + clientMap); system.out.println(); //空のクライアントマップSystem.out.println("空のクライアントマップに新しいレコードを追加する "); system.out.println(" + string = " + clientmap:" + string = 1234567l; clientMap.putifabsent(netID、str1); system.out.println( "以前のclientMap:" + clientMapを追加); system.out.println( "returen value result:" + results); system.out.println(); //繰り返しsystem.out.out.out.println( "repit of last recordmap"); result2 = clientmap.putifabsent(netId、str1); system.out.println( "clientmap:" + clientmap); system.out.println( "returen value result:" + result2); system.out.println(}}}}}上記は、concurrentmap.putifabsent(key、value)の使用例に関するこの記事の全体的な内容であり、私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!