2

最終的で不変の がEnumSetあります。つまり、コンストラクターで一度初期化されます。

このスレッドのcontains()メソッドは安全ですか? EnumSet内部的にイテレータを使用して内容チェックを行っています。したがって、2 つのスレッドが同時に を呼び出している場合contains()、1 つの呼び出しでのイテレータの位置が他のスレッドに影響を与える可能性がありますか? それとも、これら 2 つのスレッド呼び出しでイテレータのインスタンスが異なるのでしょうか?

4

2 に答える 2

1

anの内容は、それが final であるという参照EnumSetに関係なく変更できます。いいえは不変です。ただし、via をラップすることはできます。オリジナルへの参照を一切保持しない場合、変更不可能なラッパー オブジェクトは機能的に不変になります。EnumSetEnumSetCollections.unmodifiableSet()EnumSet

可変性にもかかわらず、が変更されないSet限り、2 つの反復子が同時に同じ操作を行っても問題Setはありません。これは、イテレータが 1 つの場合とまったく変わりません。

いずれにせよ、可能性のあるcontains()メソッドはEnumSetイテレータを作成または使用しません。クラスはビット ベクトルを介してメンバーシップを実装するため、ビット操作を使用してcontains()テストを実行します。

于 2014-10-16T17:08:09.547 に答える