【问题标题】:Which Thread Hold Lock in wait() and notify() multithreadingwait() 和 notify() 多线程中哪个线程持有锁
【发布时间】:2017-12-07 20:14:34
【问题描述】:

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

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. 调用同步方法时哪个线程是所有者。
  2. 哪个线程持有锁ThreadTest或SecondThread
  3. 这里释放锁是什么意思 obj.wait();方法 ?一旦锁被释放,同一个对象是否可以进入同步块并访问代码,直到前一个线程得到通知?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    From the Javadocs(我的粗体字):

    public final void wait(long timeout)
                throws InterruptedException
    

    ...

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

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

    线程 T 然后从该对象的等待集中移除,并且 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上同步的权利;一旦它 已经获得了对象的控制权,它的所有同步声明都在 对象恢复到之前的状态——也就是说,恢复到 调用等待方法时的情况。螺纹 T 然后从调用等待方法返回。因此,在返回 从等待方法,对象的同步状态和 线程 T 与调用 wait 方法时完全相同。

    所以,在你的例子中:

    1. 一个线程进入您的run() 方法,然后等待锁定obj
    2. 一旦获得该锁,它就会进入obj.wait() 并释放对obj() 的锁
    3. 当它唤醒时(出于上述四个原因之一),它会等待锁定 obj,然后再从 obj.wait() 返回。

    “哪个线程持有锁?”的答案完全取决于您检查对象的时间。如果您的所有线程都阻塞在 obj.wait() 等待唤醒,则 no 线程持有锁。

    【讨论】:

      【解决方案2】:
      1. 调用同步方法时哪个线程是所有者。

      进入synchronized 块的线程。

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

      进入synchronized 块的线程。

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

      表示锁被释放。这似乎非常清楚。不清楚你在问什么。

      一旦锁被释放,同一个对象就可以进入同步块并访问代码

      是的。

      直到上一个线程得到通知?

      直到wait() 中的线程退出wait()

      【讨论】:

        【解决方案3】:

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

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

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

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

        一旦锁被释放,同一个对象是否可以进入同步块并访问代码,直到前一个线程得到通知?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多