Безопасность потоков - это безопасность совместного использования данных, и поскольку в вашем коде вы принимаете решения на основе данных, которые хранятся в ваших объектах, целостность и детерминированное поведение этих данных имеют жизненно важное значение.т.е.
Представьте, что у нас есть общая логическая переменная экземпляра для двух потоков, которые собираются выполнить метод со следующей логикой
- Если флаг равен false, тогда я печатаю «false» изатем я устанавливаю флаг обратно в true.
- Если флаг равен true, тогда я печатаю «true», а затем я устанавливаю флаг обратно в false.
Если вы постоянно работаете воднопотоковый цикл, у вас будет детерминированный вывод, который будет выглядеть следующим образом:
false - true - false - true - false - true - false ...
Но, если вы запустилитот же код с двумя потоками, то вывод вашего вывода больше не является детерминированным, причина в том, что поток A может проснуться, прочитать флаг, увидеть, что это ложно, но прежде чем он сможет что-либо сделать, поток B пробуждается ичитает флаг, что тоже неверно !!Так что оба будут выводить false ... И это только один проблемный сценарий, который я могу придумать ... Как видите, это плохо.
Если вы удалите обновления уравнения, проблема исчезнет.только потому, что вы устраняете все риски, связанные с синхронизацией данных.вот почему мы говорим, что неизменяемые объекты являются поточно-ориентированными.
Важно отметить, что неизменяемые объекты не всегда являются решением, у вас может быть случай данных, которые вам нужно разделить между различными потоками, вВ этом случае есть много методов, которые выходят за рамки простой синхронизации и могут сильно повлиять на производительность вашего приложения, но это совершенно другой вопрос.
Неизменяемые объекты важны для гарантии того, чтоОбласти приложения, которые, как мы уверены, не нуждаются в обновлении, не обновляются, поэтому мы точно знаем, что у нас не будет проблем с многопоточностью
Возможно, вам будет интересно посмотретьна пару книг:
Это самая популярная: http://www.amazon.co.uk/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&qid=1329352696&sr=8-1
Но я лично предпочитаю эту: http://www.amazon.co.uk/Concurrency-State-Models-Java-Programs/dp/0470093552/ref=sr_1_3?ie=UTF8&qid=1329352696&sr=8-3
Имейте в виду, что многопоточность, вероятно,хитрый аспект любого приложения!