5

私が見つけたいくつかのAndroidオープンソースコードで

 private Map<ImageView, String> imageViews=Collections.synchronizedMap(new
 WeakHashMap<ImageView, String>());

Mapノーマルとノーマルの違いを誰か説明してくれませんかcollections.synchronizedmap

4

7 に答える 7

2

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)を参照して ください

于 2013-01-22T06:47:26.273 に答える
1

Collections.synchronizedMapMapオブジェクトをほぼラップして、mapメソッドのすべての呼び出しが同期されるようにします。つまり、一度に1つのスレッドだけがマップを更新またはクエリできます。

于 2013-01-22T06:41:33.847 に答える
1

Collections.synchronizedMap()スレッドセーフを実現するための非常に貧弱な方法です。各メソッドがロックされるため、最大で1つのスレッドがマップにアクセスできます。比較と設定としてのアトミック操作はサポートされていません。また、キー/値を反復処理するときは、オブジェクトを自分で同期することを忘れないでください。そうしないと、すべての魔法が失われます。

ConcurrentHashMapスレッドセーフが必要な場合は、を見てくださいMap

于 2013-01-22T06:41:44.257 に答える
1

コレクションユーティリティクラスは、スレッドセーフなコレクション(List、Set、Queue、Map)を作成するための静的メソッドを提供します。したがって、スレッドセーフでないコレクションをスレッドセーフなコレクションに変換するには、コレクションで同期メソッドを呼び出してから、コレクションをパラメーターとして渡します。

スレッドセーフコレクションには、一度に1つのスレッドのみがアクセスできます。

URL:http ://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html

于 2013-01-22T06:42:24.787 に答える
1

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection)

同期されたマップはスレッドセーフなマップです。つまり、読み取り/書き込み操作はスレッドセーフです。

于 2013-01-22T06:40:15.867 に答える
1

「同期」を使用して、同時に実行される 2 つのスレッドまたはプロセスがプログラムの特定の部分を同時に実行しないようにします。

于 2013-01-22T06:40:55.260 に答える
1

通常のマップはありません。Map だけを作成することはできません (new Map() はコンパイルされません)。Map は、さまざまな種類のマップ (hashMap、synchronizedMap、WeakHashMap など) のデータにアクセスするための共通のインターフェイスです。Java の本、コレクションの章を読んでください。

Map を共通インターフェースとして使用すると、すべてのタイプの Map 実装で機能するデータ操作アルゴリズムを作成できます。したがって、実装を切り替えることができます (HashMap だけでなく、ここで同期マップが必要であることに気付いたかもしれません)。コードは機能します。

synchronizedMap は単なるラッパーです。基になる Map のすべてのデータ アクセス関数をラップし、スレッド セーフにします。

あなたの場合、「実際の」マップである WeakHashMap があります。WeakHashMap は、マップがデータを格納する方法を定義します (キーにはハッシュを使用し、値には weakRefences を使用します)。次に、それを synchronizedMap にラップして、マップ スレッドを安全にします。

于 2013-01-22T06:38:18.130 に答える