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

时间:2019-01-29 09:53:35

标签: java multithreading synchronized

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

一个简单的事实是,线程B已经完成了足以使线程A从其等待状态介入并执行该方法的方法的执行?还是我需要在同步方法中的某个地方调用notifyAllnotify

1 个答案:

答案 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节)     代表执行线程,执行一个块,然后释放     锁定。虽然执行线程拥有该锁,但是其他线程都不能     获取锁。