我正在研究Java并发。我有一个关于和锁的问题。Synchronzied Getter和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?那么,当有一个线程使用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;}
}
对于我的了解,现在,只有一个线程可以同时调用这些方法。那么如何让一个线程可以修改value1而另一个线程修改value2?
非常感谢您的善意澄清!
的对象的所有同步方法使用相同的锁定对象,该对象是对象本身,根据定义。请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – 2012-02-12 09:06:07