猿问

什么事件会使等待线程执行另一个线程已经运行的同步方法?

在 Java 编程中,如果我有一个线程 A 在尝试执行synchronized另一个线程 B 正在执行的同一对象的方法时被阻塞,那么什么事件将使线程 A 执行同步方法成为可能?

线程 B 已完成执行该方法这一简单事实是否足以让线程 A 从其等待状态中介入并执行该方法?或者我需要在同步方法中调用notifyAllor吗?notify


芜湖不芜
浏览 88回答 1
1回答

子衿沉夜

Java 教程 说:当一个线程正在执行一个synchronized对象的方法时,所有其他调用synchronized同一对象的方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。Java Language Reference 说(强调是我的):8.4.3.6。synchronized方法方法synchronized在执行之前获取监视器(第 17.1 节)。对于类(静态)方法,使用与方法类的 Class 对象关联的监视器。对于实例方法,使用与 this(调用该方法的对象)关联的监视器。17.1. 同步Java 编程语言为线程之间的通信提供了多种机制。这些方法中最基本的是同步,它是使用监视器实现的。Java 中的每个对象都与一个监视器相关联,线程可以锁定或解锁监视器。一次只有一个线程可以锁定监视器。任何其他试图锁定该监视器的线程都会被阻塞,直到它们能够获得对该监视器的锁定。一个线程 t 可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果。该synchronized语句(第 14.19 节)计算对对象的引用;然后它会尝试在该对象的监视器上执行锁定操作,并且在锁定操作成功完成之前不会继续进行。执行完锁定操作后,将 synchronized执行语句体。如果主体的执行已经完成,无论是正常的还是突然的,都会在同一个监视器上自动执行解锁操作。14.19。同步声明一条synchronized语句代表正在执行的线程获取互斥锁(第 17.1 节),执行一个块,然后释放锁。当执行线程拥有锁时,没有其他线程可以获取锁。
随时随地看视频慕课网APP

相关分类

Java
我要回答