0
public class Check {

    public boolean toChange = false;

    public synchronized boolean getChange() {
        return tochange
    }

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

当 2 个不同的线程尝试同时访问 get 和 set 时,是否会由于锁定检查对象而以同步方式发生?

4

2 回答 2

4

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

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

当你创建Check c = new Check();

和 2 个线程同时t1, t2尝试访问c.getChange()c.setChange()只有一个线程将被授予对监视器的访问权限(即 instance c),另一个线程必须等到前一个线程完成工作并释放监视器。

这里实例c是用于同步访问的默认监视器

于 2013-05-19T07:33:23.673 回答
0

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

然而,线程可以通过调用释放锁而不从方法返回

Object.wait()

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

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

于 2013-05-19T07:52:29.380 回答