2012-02-12 92 views
2

我正在研究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?

非常感谢您的善意澄清!

+1

的对象的所有同步方法使用相同的锁定对象,该对象是对象本身,根据定义。请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – 2012-02-12 09:06:07

回答

5

,你基本上宣告​​表现为如果代码是所有非静态方法:

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

即有采取this隐式锁。所以所有非静态同步方法都会锁定它们被调用的实例。

静态同步方法锁定类对象本身,而不是该类的一个实例。

+1

我相信你的意思是在你的代码示例中使用'public int get(){'。 – 2012-02-12 09:49:18

4

是的,你的两个方法使用相同的锁。

​​不带参数的关键字隐式转换为syncrhonized(this),这两个方法都是相同的对象。

为了使两个块在java中具有“相同的锁定”,这意味着它们都使用同一个对象作为锁。正如我所说,在你的情况下,这两种方法都使用this作为锁对象。

0

当您声明方法​​时,这意味着同步在调用方法的特定实例上。

0

但是你有其他的同步方式。

同步块: synchronized(someLockedObj){somecode}

锁定对象: Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();