私が見つけたいくつかのAndroidオープンソースコードで
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new
WeakHashMap<ImageView, String>());
Map
ノーマルとノーマルの違いを誰か説明してくれませんかcollections.synchronizedmap
私が見つけたいくつかのAndroidオープンソースコードで
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new
WeakHashMap<ImageView, String>());
Map
ノーマルとノーマルの違いを誰か説明してくれませんかcollections.synchronizedmap
java.utilパッケージの通常のMap実装は、スレッドセーフではありません。これは、複数のスレッドが同じマップで実行get()
またはput()
操作している場合、競合状態またはマップ内のデータの不整合が発生する可能性があることを意味します。
マルチスレッド環境で既存のマップを使用するには、を呼び出すことで同じの同期インスタンスを取得できますCollections.synchronizedMap()
。get()
このような場合、、、put
などのほとんどのメソッドkeyset()
は同期され、同時に安全に使用できます。
詳細については、http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map)を参照して
ください。
Collections.synchronizedMap
Mapオブジェクトをほぼラップして、mapメソッドのすべての呼び出しが同期されるようにします。つまり、一度に1つのスレッドだけがマップを更新またはクエリできます。
Collections.synchronizedMap()
スレッドセーフを実現するための非常に貧弱な方法です。各メソッドがロックされるため、最大で1つのスレッドがマップにアクセスできます。比較と設定としてのアトミック操作はサポートされていません。また、キー/値を反復処理するときは、オブジェクトを自分で同期することを忘れないでください。そうしないと、すべての魔法が失われます。
ConcurrentHashMap
スレッドセーフが必要な場合は、を見てくださいMap
。
コレクションユーティリティクラスは、スレッドセーフなコレクション(List、Set、Queue、Map)を作成するための静的メソッドを提供します。したがって、スレッドセーフでないコレクションをスレッドセーフなコレクションに変換するには、コレクションで同期メソッドを呼び出してから、コレクションをパラメーターとして渡します。
スレッドセーフコレクションには、一度に1つのスレッドのみがアクセスできます。
URL:http ://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html
同期されたマップはスレッドセーフなマップです。つまり、読み取り/書き込み操作はスレッドセーフです。
「同期」を使用して、同時に実行される 2 つのスレッドまたはプロセスがプログラムの特定の部分を同時に実行しないようにします。
通常のマップはありません。Map だけを作成することはできません (new Map() はコンパイルされません)。Map は、さまざまな種類のマップ (hashMap、synchronizedMap、WeakHashMap など) のデータにアクセスするための共通のインターフェイスです。Java の本、コレクションの章を読んでください。
Map を共通インターフェースとして使用すると、すべてのタイプの Map 実装で機能するデータ操作アルゴリズムを作成できます。したがって、実装を切り替えることができます (HashMap だけでなく、ここで同期マップが必要であることに気付いたかもしれません)。コードは機能します。
synchronizedMap は単なるラッパーです。基になる Map のすべてのデータ アクセス関数をラップし、スレッド セーフにします。
あなたの場合、「実際の」マップである WeakHashMap があります。WeakHashMap は、マップがデータを格納する方法を定義します (キーにはハッシュを使用し、値には weakRefences を使用します)。次に、それを synchronizedMap にラップして、マップ スレッドを安全にします。