最终不可修改的套件是否安全?

Ant*_*oly 6 java collections thread-safety

该的javadoc并不清楚这一点:是不可修改的集合线程安全的?或者我应该担心内部状态并发问题?

Set<String> originalSet = new HashSet<>();
originalSet.add("Will");
originalSet.add("this");
originalSet.add("be");
originalSet.add("thread");
originalSet.add("safe?");
final Set<String> unmodifiableSet = Collections.unmodifiableSet(originalSet);
originalSet = null; // no other references to the originalSet

// Can unmodifiableSet be shared among several threads?  
Run Code Online (Sandbox Code Playgroud)

我偶然发现了一段代码,其中一个静态的,只读的Set是针对多个线程共享的......原作者写了这样的东西:

mySet = Collections.synchronizedSet(Collections.unmodifiableSet(originalSet));
Run Code Online (Sandbox Code Playgroud)

然后每个线程使用以下代码访问它:

synchronized (mySet) {
  // Iterate and read operations
}
Run Code Online (Sandbox Code Playgroud)

通过这种逻辑只有一个线程可以同时对设置进行操作.所以我的问题是,对于一个不可改变的集合,使用诸如操作时,每个,contains,size,等等,我真的需要同步访问?

Daw*_*ica 6

如果它是不可修改的Set<String>,根据你的例子,那么你很好; 因为String对象是不可变的.但是如果它是一组不可变的东西,你必须要小心两个线程都试图改变集合中的同一个对象.

你还必须要小心是否有某个地方的参考Set,这不是不可修改的.变量可能是不可修改的,但仍然指的Set是可以通过不同变量修改的变量; 但你的例子似乎已经覆盖了.