同步的Getter和Setter

时间:2012-02-12 08:59:20

标签: java concurrency getter-setter

我正在研究Java并发。我有关于synchronized和锁定的问题。

对于任何可变数据,我们应该将访问数据的所有方法放在同一个锁中。

但是,同样的锁是什么意思?

示例:

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);

for(int i=0;i<100;i++) System.out.println(i);

这个方法也会被包含在与setter和getter相同的块中?那么,当有一个线程使用setter或getter时,其他线程无法运行此方法?

而且,如果我将课程改为以下内容怎么办?

}

根据我的理解,现在只有一个线程可以同时调用这些方法。那么什么是让一个线程可以修改value1而另一个线程修改value2 ???

的方法

非常感谢您的善意澄清!!!!

4 个答案:

答案 0 :(得分:5)

您声明synchronized的所有非静态方法的行为基本上与代码一样:

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

即。对this采取隐式锁定。因此,所有非静态同步方法都将锁定调用它们的实例。

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

声明方法synchronized时,意味着同步位于要为其调用方法的特定实例上。

答案 3 :(得分:0)

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

同步块: synchronized(someLockedObj){somecode}

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