Какая разница между:
public synchronized void test(){}
и
public void test() {
synchronized(Sample.class){}
}
Какая разница между:
public synchronized void test(){}
и
public void test() {
synchronized(Sample.class){}
}
Чтобы сделать разницу более ясной, первое можно переписать как:
public void test() {
synchronized(this){
}
}
Разница в том, что первый синхронизируется с экземпляром класса, а второй - с самим классом.
В первом случае два потока могут одновременно выполнять test()
в двух экземплярах вашего класса. Во втором они не могут.
Объявление метода экземпляра synchronized
- это просто синтаксический сахар, эквивалентный наличию блока synchronized (this)
. Другими словами, только один поток может выполнять метод в этом экземпляре в один момент времени.
synchronized (Sample.class)
означает, что все экземпляры этого класса совместно используют один объект блокировки (сам объект класса), и только один поток может выполнить этот метод для любого экземпляра в один момент времени.
Чтобы завершить ответ @ 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(){}
}
Sample.class
из класса Sample
, это то же самое, что синхронизация статического метода в классе Sample
. В этом суть моего ответа - synchronized
метод на самом деле является методом synchronized
на объекте, которому принадлежит метод. Будь то объект-экземпляр или сам объект класса. Вы знакомы с концепцией static
?
- person Elist; 09.12.2014