1

たとえば、複数の値を持つ列挙型があるとします。

public enum Category {
  A, B, C, D;
}

また、一度にカテゴリごとに 1 つのアイテムのみを処理するように、ロック メカニズムを作成したいと考えています。私の最初のアイデアは、次のようなことをすることでした:

Set categories = new HashSet();
for (Category cat : Category.values() {
  categories.put(cat);
}

そして、ロックを取得する必要がある場合は、次のようにします。

synchronized(categories.get(category)) {
  ....
}

これは機能しますか、それともすべてグローバルな列挙値への参照であるため、他のスレッドが他の場所で同じことをした場合、それらは互いにブロックしますか?

ありがとう!

4

3 に答える 3

4

各列挙値はsingletonです。enumクラスをロードしたクラスローダのインスタンスは 1 つだけ存在します。そうです、2 つのスレッドが enum 値をロックとして使用する場合、それらは同じロックを使用するため、互いにブロックされます。

補足: 有効なコンパイル Java コードを使用した場合、質問はより明確になります。

于 2012-05-02T10:51:29.673 に答える
3

Category.Aインスタンスは 1 つしかないため、すべてsynchronized(Category.A)が互いにブロックされます。これが、セットで行っていることです。

列挙型に関連付けられたプライベート最終EnumMapを使用し、それを s で埋めnew Object()、マップを変更しないことを確認し、カテゴリに関連付けられたオブジェクトをそのカテゴリのロックとして使用できます。そうすれば、ロックがそのコードでのみ使用されることが確実になります。

于 2012-05-02T10:51:45.940 に答える
0

列挙型はプロジェクト (パッケージ) に表示されます。このロジックを他の場所で使用する必要がある場合は、このプロジェクトへの参照を追加する必要があります。

于 2012-05-02T10:50:20.050 に答える