Я просматривал код параллельных коллекций java и вижу, что они просто обертывают простые коллекции, блокируя некоторую блокировку в начале операции и разблокируя ее в конце.
А как же volatile
? Если внутренняя коллекция не является изменчивой, изменения могут быть пропущены другими потоками, и поэтому сохранение потока несколько нарушено. Я знаю, что synchronized
может решить эту проблему, но они используют только блокировки без дальнейшей синхронизации.
Это проблема, или я что-то упустил?
Обновление:
После небольшого обсуждения я хочу немного перефразировать вопрос.
Я хочу использовать Java-коллекции в многопоточной среде. (Например, сейчас я говорю о PriorityBlockingQueue
)
Я хочу быть уверен, что изменения, внесенные одним потоком в коллекцию (push / pop), сразу видны другим.
Хорошо, что одновременные коллекции java не позволяют мне погружаться в неприятности, чтобы поддерживать внутреннее состояние коллекции стабильным, когда число потоков обновляет ее, но
Я хочу быть уверен, что сами данные видны всем потокам.
Вопрос в том, правильно ли я, что одновременные коллекции java не предоставляют эту функцию из коробки? И если я это сделаю, какие дополнительные (минималистичные) методы я должен использовать, чтобы обеспечить желаемую видимость?
Спасибо.