3

次のコードを使用して、EnumSet の同期インスタンスを初期化します。

private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));

2 つの質問があります。

  • この場合、コンパクトさと効率性などの EnumSet のすべての利点を保持できますか?
  • EnumSetの空で同期されたインスタンスを取得するための意味的に豊富な方法はありますか?
4

1 に答える 1

8

まあjavadocから:

複数のスレッドが列挙型セットに同時にアクセスし、少なくとも 1 つのスレッドがセットを変更する場合は、外部で同期する必要があります。これは通常、列挙型セットを自然にカプセル化するオブジェクトを同期することによって実現されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedSet(java.util.Set) メソッドを使用してセットを「ラップ」する必要があります。これは、偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。

Set s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

だから私はそれがあなたができる最善だと思います。

私もSet finalあなたがしたように保ちます。彼らがjavadocで言及していないのは奇妙です。

編集:最初の質問に答えるには、短い答えはい、長い答え、はいですが、それに加えて同期の代価を支払う必要があります。

于 2014-06-23T16:29:18.823 に答える