- Не являются ли атомарные операции возврата и присваивания в Java?
Да, они атомарные (по крайней мере, в некоторых случаях), но атомарность - не единственная проблема,Другая важная проблема заключается в том, гарантируется ли действие записи в атрибуте одним потоком для следующего чтения для того же атрибута, сделанного другим потоком.
Когда чтенияи записи находятся в одном потоке, чтение гарантированно увидит более раннюю запись.
Когда операции чтения и записи находятся в разных потоках, чтение гарантированно увидит только более раннюю записьесли два потока синхронизируются должным образом ... или если атрибут объявлен как volatile
.
Обратите внимание, что примитивные блокировки / мьютексы - не единственный способ синхронизации.
- Поскольку свойства не обязательно взаимосвязаны, не всегда имеет смысл синхронизировать с одной и той же блокировкой.Как организовать структуру блокировки?
Имеет смысл использовать несколько блокировок, если (и только если) вероятен конфликт блокировок.В вашем примере проблема блокировки может возникнуть только в том случае, если какой-либо экземпляр Doggie
получает очень высокую скорость операций get и / или set.
- Лучше использоватьвстроенная блокировка или шаблон блокировки закрытого объекта?
Зависит от этого.Если ваше приложение будет использовать примитивную блокировку объекта Doggie
, то вы можете получить конфликт блокировки или даже непреднамеренную блокировку операций get и set.В этом случае частная блокировка может быть целесообразной.В противном случае частная блокировка - это ненужные накладные расходы.