固有锁的工作

时间:2013-05-19 07:30:35

标签: java

public class Check {

    public boolean toChange = false;

    public synchronized boolean getChange() {
        return tochange
    }

    public synchronized setChange(boolean change) {
        this.tochange = change
    }
}

当2个不同的线程尝试访问get并设置simultanoesuly时,是否会因锁定检查对象而以同步方式发生?

2 个答案:

答案 0 :(得分:4)

由于这两种方法都是非静态同步,因此在任何时刻都没有2个线程可以同时执行这两种方法,如果它们属于同一个INSTANCE 。

所以是的,它将以同步的方式发生,在这个类的实例中。

创建Check c = new Check();

和2个线程即t1, t2尝试同时访问c.getChange()c.setChange(),只有一个线程可以访问监视器(实例c)和其他线程必须等到上一个线程完成工作并释放监视器。

此处,实例c是用于同步访问的默认监视器

答案 1 :(得分:0)

只有一个线程可以保持对象的锁定。然后它只是那个可以进入该对象的同步方法的线程。没有其他线程可以访问该对象的任何同步方法。

然而,线程可以通过调用

来释放锁而无需从方法返回
Object.wait()

其他线程将处于阻塞状态,直到第一个线程释放对Check对象实例的锁定。另请注意,任何线程都可以输入不在对象上同步的类的方法。

所以答案是两个不同的线程无法同时访问get和set方法。