@vetalmatitskiy
testing engineer

Как правильно использовать immutable-объекты для многопоточных приложений?

Доброго дня, уважаемые гуру Java. Анализируя вопросы которые задают на собеседованиях пытаюсь более детально разобратся с темой immutable-объектов. К сожалению те ресурсы, которые предлагает гугль дают лишь очень общую информацию в стиле "immutable-объекты, это те объекты которые не могут быть изменены в программе. для того, чтобы объект был immutable используйте модификатор final". Как энциклопедические знания такое конечно можно сказать, на собеседовании, но думаю там хотят слышать понимание более глубоких принципов. кроме того, хочу написать мини-проект для лучшего понимания этого из наиболее понятного пока нашел лекцию https://youtu.be/z8bstpYRV9I там хотя бы на примере показывается как immutable связано с многопоточностью. и понятно, почему важно использовать immutable-объекты. к сожалению видео освещает не все моменты можете ли Вы пояснить на примерах или подсказать адекватные источники, где раскрыты рекомендации по использованию неизменяемых объектов в контексте многопоточности?
  • Вопрос задан
  • 599 просмотров
Пригласить эксперта
Ответы на вопрос 3
zolt85
@zolt85
Программист
Для того, чтобы правильно что-то использовать нужно знать как это работает. В этом как раз проблема, как я понял. Советую погуглить доклады г-на Куксенко на тему Java Memory Model, даст Вам направление куда копать. Вот первый попавшийся в гугле: www.youtube.com/watch?v=QBLKJxURdro. Тема очень интересная. Разберетесь - сможете писать эффективные многопоточные приложения.
Ответ написан
Комментировать
@bromzh
Drugs-driven development
В первую очередь надо понимать и уметь работать с коллекциями в многопоточной среде. Модификатор final ещё не означает, что поле нельзя изменить. Он лишь указывает, что такому полю нельзя дважды присвоить значение через оператор =.
На тему коллекций в многопоточности есть вот это: www.youtube.com/watch?v=-yQeYo32Lt4

Ну а в целом, всё в принципе просто. В многопоточной среде появляется необходимость использовать некие общие данные. Первый вариант - это использовать синхронизации (семафоры, мьютексы и т.д.). Другой вариант - объявить, что все данные неизменяемые. Данные полям можно присвоить только 1 раз, все коллекции тоже неизменяемые. Тогда можно считывать их значения без использования синхронизаций (которые порой бывают сложными, да и лишняя память тратится) и прозрачно обрабатывать их в несколько потоков.
Ответ написан
Комментировать
angry_cellophane
@angry_cellophane
Лучше почитать: классика - Java concurrency in practice, еще хорошее объяснение можно найти здесь: сравнение разделяемой, изолированной мутабельности и иммьютабл объектов; concerrency primitives vs STM vs actors.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы