Синхронизатор Путаница - PullRequest
0 голосов
/ 14 мая 2019
 class MutableInteger {

    private int value;

    public synchronized void increment() {
        value++;
    }

    public synchronized int getValue() {
        return value;
    }

 public void nonSync(){

 }

}

Я пытаюсь понять, как работает ключевое слово синхронизации.

У меня есть класс с методами, которые синхронизированы, это означает, что на этом конкретном экземпляре объекта только один поток может вызвать этометод за один раз?Это относится только к этому методу, хотя?Таким образом, если поток A вызывает инкримент, поток B должен будет ждать, пока поток A не завершит выполнение метода?Но это только метод по методу?

однако, если бы я сделал

synchronized(this) {
  //code
}

, который бы блокировал весь экземпляр объекта?

Имеет ли это смысл.. По сути, я понимаю, что это должно делать, просто пытаясь заполнить пробелы

1 Ответ

0 голосов
/ 14 мая 2019

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

synchronized myMethod() {
    //code
}

По сути, такое же поведение, как если бы вы написали:

myMethod() {
    synchronized(this) {
        //code
    }
}

Обратите внимание, что this это просто Object и используется какбудет использоваться блокировка, как и любой другой объект - блокировка может принадлежать только одному потоку за раз, остальные должны ждать, пока он войдет в блок synchronized, используя тот же объект.Поскольку методы с ключевым словом synchronized ведут себя таким образом, они совместно используют блокировку, являющуюся самим экземпляром.

Итак, если у вас есть методы increment() и decrement(), оба помеченные synchronized, то тольколюбой из двух может использоваться и одним потоком за раз.

Между тем, другие методы без ключевого слова synchronized остаются полностью незатронутыми и будут работать одинаково, независимо от того, есть ли синхронизированные методы вокруг них или нет.

...