Я изучаю параллелизм Java прямо сейчас. У меня есть вопрос о synchronized
и замках.Synchronzied Getter and Setter
Для любых изменяемых данных мы должны поместить весь метод, получающий доступ к данным в одной и той же блокировке.
Но что же такое блокировка означает?
Пример:
public class SynchronizedInteger{
private int value;
public synchronized int get(){return value;}
public synchronized void set(int value){this.value=value;}
}
Итак, мой вопрос, почему эти два метода в том же замке? Я знаю, что они есть, но я хотел бы знать, почему? И означает ли это, что все синхронизированные методы в классе находятся в одной блокировке?
Редактировать:
так, если я добавил еще один метод к классу:
public synchronized void printOneToHunder(){
for(int i=0;i<100;i++) System.out.println(i);
}
Этот метод также может быть включен в одном блоке установки и получения? Таким образом, другой поток не может запустить этот метод, когда есть один поток, используя либо setter, либо getter?
И что, если я изменить класс ниже:
public class SynchronizedInteger{
private int value1;
private int value2;
public synchronized int get1(){return value1;}
public synchronized void set1(int value){this.value1=value1;}
public synchronized int get2(){return value2;}
public synchronized void set2(int value){this.value2=value2;}
}
Для моего понимания прямо сейчас, только один поток может вызвать эти метода в одно время. Итак, какой способ сделать один поток может изменить значение1, а другой поток - изменить значение2 ???
Большое спасибо за ваши любезные разъяснения !!!!
Все синхронизированные методы объекта используют один и тот же объект запирающий, который сам объект, по определению. См. Http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –