Java Синхронизировано на объект или переменную? - PullRequest
0 голосов
/ 29 февраля 2020

Хорошо, я постараюсь четко сформулировать это. Это синхронизация объекта на самом объекте или ссылка на объект?

То есть, если у меня будет

Object lock1 = new Object();
Object lock2 = lock1;

, будет ли блок synchronized (lock1) код блока synchronized (lock2)?

Оба ссылаются на один и тот же фактический объект, просто с разными ссылками ...

Я думаю , что важен не объект, а объект, но я являюсь не уверен.

Спасибо.

1 Ответ

1 голос
/ 29 февраля 2020
Object lock1 = new Object();
Object lock2 = lock1;

Оба ссылаются на один и тот же фактический объект, только с разными ссылками ...

Это неверно, значение не примитивов в Java является ссылка на экземпляр. Следовательно, оба ссылаются на один и тот же объект с одной и той же ссылкой .

Вы можете назначить этот объект любой переменной, которая вам нравится, и с помощью синхронизированного блока будет выполнена синхронизация по этот экземпляр объекта. Мониторы блокировок находятся на самих экземплярах Object.

Вы можете увидеть некоторые доказательства этого, когда взгляните на методы класса Object, связанные с блокировкой. Вот метод уведомления, используемый для уведомления потоков, ожидающих освобождения блокировки, чтобы они могли выполнить синхронизированный блок:

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify ()

...