Каково различие между синхронизированным методом и синхронизировало блок в Java? [дубликат]

Любой код интерфейса БД абсолютно должен войти в управление версиями (Хранимые процедуры, Функции, и т.д.).

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

36
задан Ravindra babu 14 September 2016 в 15:12
поделиться

5 ответов

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

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

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}

Для статических методов класс будет заблокирован:

class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}

Для синхронизированных блоков вы может использовать любой объект, отличный от null , в качестве блокировки:

synchronized (mymap) {
  mymap.put(..., ...);
}

Область блокировки

Для синхронизированных методов блокировка будет удерживаться во всей области действия метода, а в блоке synchronized , блокировка сохраняется только во время этой области действия блока (также известной как критическая секция). На практике,

45
ответ дан 27 November 2019 в 05:57
поделиться

Синхронизированный метод - это сокращение. Это:

class Something {
    public synchronized void doSomething() {
        ...
    }

    public static synchronized void doSomethingStatic() {
        ...
    }
}

для всех намерений и целей эквивалентно следующему:

class Something {
    public void doSomething() {
        synchronized(this) {
            ...
        }
    }

    public static void doSomethingStatic() {
        synchronized(Something.class) {
            ...
        }
    }
}

(где Something.class - это объект класса для класса Something .)

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

8
ответ дан 27 November 2019 в 05:57
поделиться

Да, это одно отличие. Во-вторых, вы можете получить блокировку для других объектов, кроме этого .

4
ответ дан 27 November 2019 в 05:57
поделиться

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

Где синхронизированный блок может блокировать ЛЮБОЙ объект - обычно объект мьютекса, определенный как переменная экземпляра. Это позволяет лучше контролировать, какие замки действуют.

0
ответ дан 27 November 2019 в 05:57
поделиться

Ключевое отличие состоит в следующем: если вы объявляете метод для синхронизации, то все тело метода становится синхронизированным; однако, если вы используете синхронизированный блок, вы можете заключить только «критическую часть» метода в синхронизированный блок, оставив остальную часть метода вне блока.

Если весь метод является частью критический раздел, то фактически никакой разницы нет. Если это не так, вам следует использовать синхронизированный блок только вокруг критической секции. Чем больше операторов в синхронизированном блоке, тем меньше общий параллелизм, поэтому вы хотите свести их к минимуму.

2
ответ дан 27 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: