在Java编程中,如果我在尝试执行另一个线程B正在执行的同一对象的synchronized
方法时阻塞了线程A,那么什么事件将使线程A可以执行同步方法?
一个简单的事实是,线程B已经完成了足以使线程A从其等待状态介入并执行该方法的方法的执行?还是我需要在同步方法中的某个地方调用notifyAll
或notify
?
答案 0 :(得分:1)
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节) 代表执行线程,执行一个块,然后释放 锁定。虽然执行线程拥有该锁,但是其他线程都不能 获取锁。