Поточно-безопасный HashSet с коллекциями Guava

Как следует из названия, я хотел бы получить потокобезопасный HashSet с использованием коллекций Guava.
Доступны ли какие-либо?


person santiagobasulto    schedule 02.09.2010    source источник
comment
Не было бы смысла делать в threadsafe, когда он уже неизменяем, не так ли?   -  person whiskeysierra    schedule 02.09.2010
comment
Ты прав, Вилли. Это не будет неизменным. Несколько потоков будут изменять его одновременно.   -  person santiagobasulto    schedule 02.09.2010
comment
Кстати, не стоит отдавать предпочтение коллекциям из Гуавы, а не JDK, только потому, что они из Гуавы. Используйте каждый из них, когда они больше всего подходят для того, что вы делаете.   -  person ColinD    schedule 02.09.2010
comment
@Colin: Полностью согласен, и на самом деле в моем ответе вообще не используются какие-либо классы Guava, а только то, что поставляется с Java Concurrency Framework. :-П   -  person Chris Jester-Young    schedule 02.09.2010
comment
@CollinD: Да, это абсолютно верно. Но я хорошо знаю коллекции java.util и java.concurrent. У меня запущена сложная программа, и я пытался протестировать коллекции Guava.   -  person santiagobasulto    schedule 02.09.2010
comment
@santiago: Если вы действительно хотите увидеть сияние гуавы, попробуйте Multimap и Multiset, а также мягкие/слабые ключи/значения с MapMaker. :-) (Конечно, есть много других функций, слишком много, чтобы я мог их охватить.)   -  person Chris Jester-Young    schedule 02.09.2010
comment
Я использовал эту карту с мягкими ссылками в системе кэширования и работает очень хорошо new MapMaker().softKeys().makeMap()   -  person santiagobasulto    schedule 02.09.2010
comment
@whiskeysierra: Никогда не предполагайте, что де-факто неизменяемый класс является потокобезопасным. Такой класс не защищен от проблем с видимостью памяти и переупорядочения кода, и поэтому он НЕ является потокобезопасным.   -  person 30thh    schedule 10.03.2018
comment
@ 30thh Какой смысл иметь и использовать неизменяемый класс, если я не могу на него полагаться?   -  person whiskeysierra    schedule 12.03.2018
comment
Неизменяемость @whiskeysierra вообще не имеет ничего общего с безопасностью протектора. Только простые неизменяемые объекты со всеми полями, объявленными как final, гарантируют потокобезопасность. Пожалуйста, поищите в Google безопасную инициализацию JMM.   -  person 30thh    schedule 12.03.2018


Ответы (4)


Это был бы правильный ответ, используя класс Sets из Guava. В любом случае, ответ от @crhis был добрым намерением.

Sets.newSetFromMap(new ConcurrentHashMap<V, Boolean>());
person santiagobasulto    schedule 06.09.2010
comment
На самом деле, теперь это устарело, в настоящее время следует использовать Collections.newSetFromMap(new ConcurrentHashMap<V, Boolean>());. - person sarsonj; 15.10.2019

В Java 8 представлен новый способ создания параллельного набора хэшей — ConcurrentHashMap.newKeySet()

Set<K> set = ConcurrentHashMap.newKeySet();

Это короче, чем упаковка в Collections.newSetFromMap

person turbanoff    schedule 14.06.2018

Коллекции Google имели фабричный метод с именем Sets.newConcurrentHashSet() некоторое время.

Его реализация была аналогична предложению Криса:

public static <E> Set<E> newConcurrentHashSet() {
  return newSetFromMap(new ConcurrentHashMap<E, Boolean>());
}

У них был метод newSetFromMap() внутри класса com.google.common.collect.Sets (написанный Дугом Ли при содействии членов JCP JSR-166). Этот метод был добавлен в java.util.Collections в java 1.6.

Он был отозван в Google Collections 1.0rc1, поскольку есть планы улучшить поддержку параллельных наборов в Guava (дополнительная информация здесь).

В этом сообщении подробно рассматривается использование метод newSetFromMap для создания параллельных наборов.

person Etienne Neveu    schedule 03.09.2010
comment
Google guava все еще имеет метод newConcurrentHashSet() BTW. google.github.io/guava/releases/27.0-jre/api/docs/com/google/ - person turbanoff; 02.11.2018

person    schedule
comment
Кстати, все ваши баллы принадлежат мне, так как я ответил на этот вопрос в списке рассылки гуавы, за 8 минут до того, как он был опубликован здесь;) - person whiskeysierra; 02.09.2010
comment
@Willi: Если бы я мог назначить их вам, я бы это сделал, потому что я уже достиг предела своей репутации за день, поэтому я не получаю абсолютно никакой репутации за этот ответ. :-П - person Chris Jester-Young; 02.09.2010
comment
Вы могли бы подумать, что есть более простой способ сделать это. - person ColinD; 02.09.2010
comment
@Colin: Добро пожаловать в Java! Если вы хотите простоты, кодируйте на Ruby или Scheme. :-П - person Chris Jester-Young; 02.09.2010
comment
@Colin: это может показаться кодом монстра. Но как только вы войдете в API и ознакомитесь с ним, вы удивитесь, насколько все просто. Это случилось со мной с Streams Framework. - person santiagobasulto; 02.09.2010
comment
Я хорошо знаком с большинством основных API-интерфейсов Java, этот трюк кажется мне особенно неинтуитивным, поскольку это лучший способ добиться этого. - person ColinD; 02.09.2010