在Java编程中,如果线程a在尝试执行另一个线程B正在执行的同一对象的synchronized
方法时被阻止,那么什么事件会使线程a执行同步方法?
线程B已经完成执行该方法这一简单事实是否足以让线程A从等待状态介入并执行该方法?或者我需要在synchronized方法中的某个位置调用notifyAll
或notify
吗?
Java教程说:
当一个线程为对象执行
synchronized
方法时为同一对象调用synchronized
方法的其他线程块(挂起执行),直到第一个线程使用对象
Java语言参考说(强调的矿):
8.4.3.6.
synchronized
方法
synchronized
方法在执行之前获取监视器(§17.1)。对于类(静态)方法,与类关联的监视器对象。
对于实例方法,与此关联的监视器(对象该方法被调用)。
17.1.同步
Java编程语言为线程之间的通信。这些方法中最基本的是同步,这是使用监视器实现的。中的每个对象Java与监视器相关联,线程可以锁定或解锁监视器。一次只能有一个线程持有监视器上的锁。任何其他试图锁定该监视器的线程被阻止,直到它们可以锁定那个监视器。线程t可以锁定特定多次监测;每次解锁都会逆转一次锁定的效果活动
synchronized
语句(§14.19)计算对对象的引用;然后它尝试在该对象的监视器上执行锁定操作,并且在锁定操作成功之前不会继续已完成。执行锁定操作后执行synchronized
语句如果尸体被处决正常或突然完成解锁操作自动在同一监视器上执行。14.19.同步语句
synchronized
语句获取上的互斥锁(§17.1)代表执行线程,执行一个块,然后释放锁定。当执行线程拥有锁时,没有其他线程可以获取锁。