Знаете ли вы, что гарантируется, что синхронизированный блок в java является атомарным?
Представьте себе следующий случай
Thread_1,2:
synchronized(object){object.modify();}
(объект является общей переменной.)
Представьте, что thread_M изменит ссылку на объект, например
synchronized(object){object = new Object()}
теперь представьте, что потоки 1 и 2 конкурируют за получение блокировки объекта
Возможно ли следующее:
1. Thread1: прочитайте старый объект
2. ThreadM: изменить ссылку на объект и отменить блокировку старого объекта
3. Thread2: читать новый объект; проверить блокировку; заблокировать его
4. Thread1: проверить блокировку (ok cos старый объект был прочитан); заблокировать его
теперь оба потока имеют блокировку и изменяют один и тот же (новый) объект
Итак, чтобы указать мой вопрос - где-то гарантировано, что в синхронизированных (объектных) шагах (1 и 4) являются атомарными (как показано на шаге 3)?