2015-11-19 5 views
2

Я рассмотрел концепцию синхронизации следующим образом: каждый объект на Java имеет монитор и блокировку. Блокировка - это объект, который может быть получен или выпущен потоком, тогда как монитор является механизмом экземпляра, который решает, может ли поток получить блокировку объекта.Очистка монитора и блокировки

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

MyClass obj1 = new MyClass(); 
    MyClass obj2 = new MyClass(); 

Будет ли каждый экземпляр имеет свой собственный монитор и замок? Или общий?

Если синхронизировать по классу:

synchronized (MyClass.class) { 
    ... 
    } 

Как он будет вести себя? Будет ли этот блок синхронизации получать блокировки obj1 и obj2? Если да, существует ли в Java иерархия блокировок?

Последующие действия: Какой правильный способ сказать «монитор объекта» или «блокировка объекта»?

+0

«Будет ли реализован этот блок синхронизации блокировок obj1 и obj2». Он получает только блокировку на MyClass.class, экземпляр класса , который возвращается 'obj {1,2} .getClass() '. –

+0

см. Это: http://stackoverflow.com/questions/14495776/synchronizethis-vs-synchronizemyclass-class, он отвечает на ваш вопрос. –

+0

Монитор и блокировка - это одно и то же, см. Https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html –

ответ

2

каждый объект на Java имеет монитор и замок.

Это звучит не так. У каждого объекта есть блокировка. Некоторые люди называют блокировку «монитором». Мониторы - это идея из прошлого, которая никогда не получала большой нагрузки, но назад, когда Java была создана, разработчики полагали, что мониторы станут следующей Большой Вещью. В принципе, монитор - это объект, методы которого все synchronized.

Будет ли каждый экземпляр иметь свой собственный ... замок?

Да.

Если я синхронизируюсь на классе ... Как он будет себя вести?

A класс is a объект.

В вашем примере есть три отдельных объекта; obj1, obj2 и MyClass.class. Каждый из этих объектов имеет свой собственный замок, и их блокировки вообще не взаимодействуют друг с другом.

+0

Я прав, если я хочу синхронизировать доступ к статическому полю или методу, то Я должен использовать 'synchronized (MyClass.class)'? Если да, то будет ли он синхронизировать и нестатические члены класса? – void

+0

@Anton Единственное, что имеет значение, - если вы хотите, чтобы разные потоки синхронизировали их доступ к тем же общим данным, тогда вам нужно _up, чтобы убедиться, что все потоки синхронизируются на одном и том же объекте. Если данные, которые вы хотите защитить, доступны через поле 'static' некоторого класса, то доступ к блокировке через поле« final static »того же класса является очевидным способом достижения этого. –

0

Если я синхронизируюсь на классе ... Как это будет выглядеть? Будет ли этот блок синхронизации получать блокировки obj1 и obj2?

Если вы синхронизируете на MyClass.class, он будет синхронизироваться только с другими попытками синхронизации на MyClass.class. Таким образом, блокировка на obj1 или obj2 не будет иметь никакого эффекта.

Если да, существует ли какая-либо иерархия блокировок на Java?

Нет, в Java нет иерархии блокировок.

Каков правильный способ сказать «монитор объекта» или «блокировка объекта»?

Обычно люди говорят только о «блокировке объекта», когда говорят о синхронизации. Монитор вступает в игру, когда вы начинаете использовать wait() и notify(), но это другая тема.

Смежные вопросы