哪个线程保持锁定在wait()和notify()多线程

时间:2017-12-07 10:30:05

标签: java multithreading

我在下面的代码中对多线程感到困惑......

public class ThreadTest implements Runnable {
        private int num;
        private static SecondThread obj = new SecondThread();


        public void run() {
            synchronized (obj) { //which thread holding lock here 
                try {

                    obj.wait();   

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }   
            }   
        }   
    }
  1. 调用synchronize方法时哪个线程是所有者。
  2. 哪个线程持有锁ThreadTest或SecondThread
  3. 这里释放锁的意思是obj.wait();意思?一旦锁定被释放,同一个对象是否会进入同步块和访问代码,直到上一个线程得到通知?

3 个答案:

答案 0 :(得分:1)

From the Javadocs(我的大胆):

public final void wait(long timeout)
            throws InterruptedException
     

...

     

此方法使当前线程(称为T)置于其中   等待设置此对象,然后放弃任何和所有   此对象的同步声明。线程T被禁用   线程调度的目的和休眠直到四件事之一   发生的情况:

     
      
  • 其他一些线程调用此对象和线程的notify方法   T恰好被任意选为要被唤醒的线程。
  •   
  • 其他一些线程调用此对象的notifyAll方法。
  •   
  • 其他一些线程中断了线程T。
  •   
  • 指定的实时时间已经或多或少。但是,如果超时为零,则不会采用实时时间   考虑和线程只是等待通知。
  •   
     

然后从该对象的等待集中删除线程T.   重新启用线程调度。然后它以通常的方式竞争   与其他线程有权在对象上同步;一旦它   已获得对象的所有控制权   该对象恢复到原状 - 即,到   调用wait方法时的情况。线程T.   然后从wait方法的调用返回。因此,返回时   从wait方法,对象的同步状态和   线程T与调用wait方法时完全一样。

所以,在你的例子中:

  1. 一个帖子输入您的run()方法,然后等待锁定obj
  2. 一旦获得该锁定,它就会输入obj.wait() 并在obj() 上释放锁定。
  3. 当它被唤醒时(出于上述四个原因之一),它会在从obj返回之前等待obj.wait()锁定。
  4. “哪个线程持有锁?”的答案完全取决于 时检查对象。如果所有线程在obj.wait()等待唤醒时阻塞,则没有线程保持锁定。

答案 1 :(得分:1)

  
      
  1. 在调用synchronize方法时,哪个主题是所有者。
  2.   

进入synchronized块的线程。

  
      
  1. 哪个线程持有锁ThreadTest或SecondThread
  2.   

进入synchronized块的线程。

  
      
  1. 释放锁定是什么意思obj.wait();意味着什么?
  2.   

这意味着锁被释放。看起来非常清楚。不清楚你在问什么。

  

一旦释放锁定,同一个对象就会进入同步块和访问代码

  

直到上一个帖子得到通知?

直到wait()中的帖子退出wait()

答案 2 :(得分:1)

1.调用同步方法时,哪个线程是所有者。 2.which线程持有锁ThreadTest或SecondThread

答。调用synchronized方法的线程将是所有者。 'synchronized(obj){'如果你的意思是这行代码,那么它不是同步方法而是同步块。在这种情况下,它的ThreadTest将锁定obj,它是SecondThread的实例。

3.在这里释放锁是什么意思obj.wait();意思?

答。释放锁定意味着放弃其声明,允许其他线程获取对该对象的锁定,以便它们可以执行同步的方法/块。 obj.wait()这里意味着ThreadTest想要放弃锁并等待一旦其他线程调用了notify就调用了'obj'上的通知,并且ThreadTest收到了这个通知,它会尝试锁定'obj'

一旦锁被释放,同一个对象会进入同步块和访问代码,直到上一个线程得到通知吗?

答。是的它可以,但前提是同一个对象拥有'obj'的锁,因为这是执行任何同步方法/块的要求。