В чем разница между этими двумя синхронизаций:Синхронизация вариантов
public synchronized void set (int i) {
this.i = i;
}
и
public void set (int i) {
synchronized (this) {
this.i = i;
}
}
В чем разница между этими двумя синхронизаций:Синхронизация вариантов
public synchronized void set (int i) {
this.i = i;
}
и
public void set (int i) {
synchronized (this) {
this.i = i;
}
}
Это разные способы написания одной и той же вещи. Java может иметь только вторую форму. Синхронизация всего тела метода на объекте метода this
является особенно распространенным случаем, поэтому язык обеспечивает быстрый и простой способ сделать это.
Спецификация языка Java утверждает эквивалентность в 8.4.3.6 synchronized Methods. synchronized void bump() { count++; }
имеет точно такой же эффект, как
void bump() {
synchronized (this) {
count++;
}
}
synchronized(this)
написаноТак что, если вы пишете второй метод, как
public void set (int i) {
// Code here is not synchronized
synchronized (this) { // only this block of code is synchronized
this.i = i;
}
// code after this is also not synchronized.
}
Но в случае второго блока, можно также синхронизировать какой-либо другой объект.
public void set (int i) {
synchronized (someObject) {
this.i = i;
}
}
Но это то же самое, не так ли? – ceving
@ceving, ваш пример будет функционально одинаковым. Но если вы хотите, чтобы метод, который должен быть полностью синхронизирован, но только код blcok из него, тогда вам придется использовать второй подход. –
Я мог бы написать дополнительный метод для этого кодового блока. – ceving
Первый - это синхронизированный метод, а второй - синхронизированный блок.
Здесь как вы synchronized
на этом объекте в блоке оба представляют собой. В synchronized-method
поток получает блокировку текущего объекта.
Примечание: в синхронизированном блоке вы можете синхронизировать блок кода вместо всего тела метода, а также использовать другой ресурс для блокировки (кроме этого).
Нет никакой разницы между двумя синхронизациями, но вторая является более гибкой: вы можете добавить несинхронизированный код за пределами блока в том же методе или синхронизировать объект, отличный от this
.
Эти два метода синхронизации эквивалентны, потому что вы дали this
в synchronized block
.
Синхронизация на основе искробезопасности блокировки или Monitor Блокировка, атрибут каждого объекта
Как и другие ответы заявили, ваше первое предложение является synchronized method
, что означает, что поток приобретет замок текущий объект.
С Oracle Обучение:
Когда поток вызывает
synchronized method
, он автоматически приобретает внутреннюю блокировку объекта и освобождает его, когда метод возвращает метода. Блокировка блокировки происходит, даже если возврат был вызван неперехваченным исключением.
Ваше второе предложение - synchronized block
или synchronized statement
. В этом случае поток получает блокировку объекта, помещенного в аргумент.
Снова от Oracle Обучение:
В отличие от синхронизированных методов, синхронизированные заявления необходимо указать объект, который обеспечивает внутреннюю блокировку:
В вашем случае вы положили this
так что потребуется замок текущего объекта, как это сделал синхронизированный метод. не
Но вы также можете дать ему еще один объект, и он будет считать свою блокировку, оставляя текущую блокировку объекта «без изменений»
Functionnally: нет – assylias
Смотрите также: http://stackoverflow.com/questions/4394976/what- is-the-difference-between-synchronizedthis-and-synchronized-method – assylias