2013-09-19 5 views
0

В чем разница между этими двумя синхронизаций:Синхронизация вариантов

public synchronized void set (int i) { 
    this.i = i; 
} 

и

public void set (int i) { 
     synchronized (this) { 
       this.i = i; 
     } 
    } 
+3

Functionnally: нет – assylias

+1

Смотрите также: http://stackoverflow.com/questions/4394976/what- is-the-difference-between-synchronizedthis-and-synchronized-method – assylias

ответ

1

Это разные способы написания одной и той же вещи. Java может иметь только вторую форму. Синхронизация всего тела метода на объекте метода this является особенно распространенным случаем, поэтому язык обеспечивает быстрый и простой способ сделать это.

Спецификация языка Java утверждает эквивалентность в 8.4.3.6 synchronized Methods. synchronized void bump() { count++; } имеет точно такой же эффект, как

void bump() { 
    synchronized (this) { 
     count++; 
    } 
} 
1
  • первый случай: весь метод синхронизируется
  • второй случай: только блок кода синхронизирован для которых 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; 
     } 
    } 
+0

Но это то же самое, не так ли? – ceving

+1

@ceving, ваш пример будет функционально одинаковым. Но если вы хотите, чтобы метод, который должен быть полностью синхронизирован, но только код blcok из него, тогда вам придется использовать второй подход. –

+0

Я мог бы написать дополнительный метод для этого кодового блока. – ceving

2

Первый - это синхронизированный метод, а второй - синхронизированный блок.

Здесь как вы synchronized на этом объекте в блоке оба представляют собой. В synchronized-method поток получает блокировку текущего объекта.

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

0

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

1

Эти два метода синхронизации эквивалентны, потому что вы дали this в synchronized block.

Синхронизация на основе искробезопасности блокировки или Monitor Блокировка, атрибут каждого объекта

Как и другие ответы заявили, ваше первое предложение является synchronized method, что означает, что поток приобретет замок текущий объект.

С Oracle Обучение:

Когда поток вызывает synchronized method, он автоматически приобретает внутреннюю блокировку объекта и освобождает его, когда метод возвращает метода. Блокировка блокировки происходит, даже если возврат был вызван неперехваченным исключением.

Ваше второе предложение - synchronized block или synchronized statement. В этом случае поток получает блокировку объекта, помещенного в аргумент.

Снова от Oracle Обучение:

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

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

Но вы также можете дать ему еще один объект, и он будет считать свою блокировку, оставляя текущую блокировку объекта «без изменений»

Смежные вопросы