Использование synchronized в Java

Какая разница между:

public synchronized void test(){}

и

public void test() {
   synchronized(Sample.class){}
}

person ward    schedule 07.12.2014    source источник


Ответы (3)


Чтобы сделать разницу более ясной, первое можно переписать как:

public void test() {    
   synchronized(this){    
   }    
}

Разница в том, что первый синхронизируется с экземпляром класса, а второй - с самим классом.

В первом случае два потока могут одновременно выполнять test() в двух экземплярах вашего класса. Во втором они не могут.

person NPE    schedule 07.12.2014

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

synchronized (Sample.class) означает, что все экземпляры этого класса совместно используют один объект блокировки (сам объект класса), и только один поток может выполнить этот метод для любого экземпляра в один момент времени.

person Mureinik    schedule 07.12.2014

Чтобы завершить ответ @ NPE -

synchronized метод - это фактически метод, который synchronized относится к объекту, которому метод «принадлежит». Будь то объект-экземпляр или сам объект класса.

Следовательно:

class Sample {
    public synchronized void test(){}
}

эквивалентно

class Sample {
    public void test() {
        synchronized(this) {}
    }
}

пока

class Sample {
    public void test() {
       synchronized(Sample.class){}
    }
}

эквивалентно:

class Sample {
    public static synchronized void test(){}
}
person Elist    schedule 07.12.2014
comment
Спасибо за ответ. Но почему статика? - person ward; 09.12.2014
comment
Когда вы синхронизируете объект Sample.class из класса Sample, это то же самое, что синхронизация статического метода в классе Sample. В этом суть моего ответа - synchronized метод на самом деле является методом synchronized на объекте, которому принадлежит метод. Будь то объект-экземпляр или сам объект класса. Вы знакомы с концепцией static? - person Elist; 09.12.2014