Извините за любительский вопрос, но поскольку javadocs не совсем понятны об этом, мне было интересно, неумолимые наборы потокобезопасны? Или я должен беспокоиться о проблемах с внутренним состоянием concurrency?
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?
Я наткнулся на кусок кода со статическим, доступным только для чтения Set
, который делится на несколько потоков... Оригинальный автор написал что-то вроде этого:
mySet = Collections.synchronizedSet(Collections.unmodifiableSet(originalSet));
И затем каждый поток обращается к нему с кодом, например:
synchronized (mySet) {
// Iterate and read operations
}
По этой логике только один поток может работать на Set сразу...
Поэтому мой вопрос заключается в том, что для немодифицируемого набора при использовании таких операций, как для каждого, contains
, size
и т.д., Действительно ли мне нужно синхронизировать доступ?