Что означает «Синхронизированный блок в Java синхронизируется на некотором объекте»? - PullRequest
0 голосов
/ 06 октября 2018

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

Любой пример из реального мира будет полезен.

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Синхронизация берет блокировку (блокировку уровня объекта или блокировку уровня класса) на объекте перед выполнением синхронизированного блока.

Синхронизированный блок в Java, таким образом, синхронизируется на объекте, на котором он берет блокировку.

Например:

synchronized (this)  // Lock on current object
synchronized (lockObject) // Lock on an object lockObject
synchronized(ClassA.class) // Lock on ClassA
0 голосов
/ 06 октября 2018

Эффект synchronized состоит в том, что только один поток одновременно может выполнять синхронизированный код.Но если мы посмотрим на детали, это не вся правда.

Предположим, у нас есть два Векторы A и B и мы хотим вызывать различные методы из разных потоков.Класс Vector является поточно-ориентированным благодаря синхронизации всех важных методов.Когда поток T1 выполняет A.add(5,"abc"), почему он должен блокировать выполнение другого потока B.get(5)?У них нет общих элементов данных, поэтому параллельное выполнение обоих вызовов не повредит.

И здесь возникает понятие «синхронизированы по A»: методы Vector синхронизируются в экземпляре Vector,таким образом, максимум один поток может выполнить синхронизированный код для любого заданного вектора .

Таким образом, вектор A синхронизируется по A, а вектор B по B. Таким образом, никакие два потока не могут управлять вектором A впараллельно, но один поток может работать на A, а другой - независимо на B.

  • С помощью конструкции synchronized(object) { ... } вы выбираете объект, с которым хотите синхронизироваться.
  • Используя ключевое слово synchronized в методе экземпляра, вы получаете синхронизацию с текущим (this) объектом, поэтому каждый экземпляр получает свою собственную синхронизацию.
  • Используя ключевое слово synchronized в статическом методе, выполучить синхронизацию с классом, чтобы вы получили защиту от всех других static synchronized методов этого класса, независимо от любого экземпляра.
0 голосов
/ 06 октября 2018

3 использования синхронизированного ключевого слова.


Точно:

final Object object = new Object();
synchronized(object) {

}

Метод синхронизации экземпляра

synchronized void foo() {

}

будет использовать текущий экземпляр какблокировка монитора, которая равна:

void foo() {
    synchronized (this) {

    }
}

Поэтому, когда вы вызываете foo в разных случаях, они не будут влиять друг на друга.


Класс синхронизированного метода

class Exmaple {

    static synchronized void foo() {

    }

}

будет использовать текущий объект класса в качестве блокировки монитора, что равно:

class Exmaple {

    static void foo() {
        synchronized (Exmaple.class) {

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