2012-02-12 2 views
2

Я изучаю параллелизм 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 ???

Большое спасибо за ваши любезные разъяснения !!!!

+1

Все синхронизированные методы объекта используют один и тот же объект запирающий, который сам объект, по определению. См. Http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

ответ

5

Все не статические методы, которые вы объявляете synchronized ведут себя, по существу, как если бы код был:

public synchronized int get() { 
    synchronized(this) { 
    // the method code 
    } 
} 

т.е. есть неявный замок на this принято. Таким образом, все нестатические синхронизированные методы блокируют экземпляр, на который они вызывают.

Статические синхронизированные методы принимают блокировку самого объекта класса, а не экземпляр этого класса.

+1

Я считаю, вы имеете в виду 'public int get() {' в вашем примере кода. –

4

Да, ваши два метода используют один и тот же замок.

Ключевое слово без параметра неявно переведено на syncrhonized(this), что является одним и тем же объектом для обоих методов.

Для того, чтобы два блока имели «одну и ту же блокировку» в java, это означает, что они оба используют тот же объект, что и блокировка. И, как я уже сказал, в вашем случае оба метода используют в качестве объекта блокировки this.

0

Когда вы объявляете метод synchronized, это означает, что синхронизация находится на конкретном экземпляре, для которого вызывается метод.

0

Но у вас есть другие способы синхронизации.

Синхронизированные блоки: synchronized(someLockedObj){somecode}

Lock-объекты: Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();