public class Check {
public boolean toChange = false;
public synchronized boolean getChange() {
return tochange
}
public synchronized setChange(boolean change) {
this.tochange = change
}
}
当2个不同的线程尝试访问get并设置simultanoesuly时,是否会因锁定检查对象而以同步方式发生?
答案 0 :(得分:4)
由于这两种方法都是非静态和同步,因此在任何时刻都没有2个线程可以同时执行这两种方法,如果它们属于同一个INSTANCE 。
所以是的,它将以同步的方式发生,在这个类的实例中。
创建Check c = new Check();
和2个线程即t1, t2
尝试同时访问c.getChange()
和c.setChange()
,只有一个线程可以访问监视器(实例c
)和其他线程必须等到上一个线程完成工作并释放监视器。
此处,实例c
是用于同步访问的默认监视器
答案 1 :(得分:0)
只有一个线程可以保持对象的锁定。然后它只是那个可以进入该对象的同步方法的线程。没有其他线程可以访问该对象的任何同步方法。
然而,线程可以通过调用
来释放锁而无需从方法返回Object.wait()
其他线程将处于阻塞状态,直到第一个线程释放对Check对象实例的锁定。另请注意,任何线程都可以输入不在对象上同步的类的方法。
所以答案是是两个不同的线程无法同时访问get和set方法。