Что такое контекст синхронизации в Java - PullRequest
6 голосов
/ 26 июля 2011

Все вы знаете контекст синхронизации в Java, что они могут быть

  • в экземпляре.
  • в экземпляре java.lang.Class для определенного загруженного класса.
  • на данном объекте

И мне нужно спросить; Когда я пишу

Dimension d = new Dimension();

synchronized(d){
  // critical atomic operation
}

синхронизация заданного объекта практически равна синхронизации на экземпляре.

поэтому, когда я пишу synchronized (d) , где d - это экземпляр объекта, тогда поток получит блокировку для всех синхронизированных блоков кода экземпляра.

Не могли бы вы дать мне более подробную информацию о контексте синхронизации.

Ваши ответы будут оценены.

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Ключевое слово synchronized обеспечивает последовательный доступ к блоку кода (который может быть целым методом), который он вводит.Сериализация доступа осуществляется с использованием объекта в качестве мьютекса блокировки.

Три основных варианта использования synchronized:

A.По статическому методу:

static synchronized void someStaticMethod() {
   // The Class object - ie "MyClass.class" - is the lock object for this block of code, which is the whole method
}

B.По методу экземпляра:

synchronized void someInstanceMethod() {
   // The instance - ie "this" - is lock object for this block of code, which is the whole method
}

C.Для произвольного блока кода:

private Object lock = new Object();
void someMethod() {
    synchronized (lock) {
        // The specified object is the lock object for this block of code
    }
}

Во всех случаях только один поток одновременно может войти в синхронизированный блок.

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

1 голос
/ 26 июля 2011

Применение синхронизированного ключевого слова к нестатическому методу является сокращением для:

public void method() {
    synchronized(this) {
        // method
    }
}

Если вы примените synchronized к статическому методу, тогда он блокирует объект класса (MyClass.class), покаметод называется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...