Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪个线程在wait()和notify()多线程中持有锁_Java_Multithreading - Fatal编程技术网

Java 哪个线程在wait()和notify()多线程中持有锁

Java 哪个线程在wait()和notify()多线程中持有锁,java,multithreading,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

在下面的代码中,我对多线程有点困惑

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();
                }   
            }   
        }   
    }
  • 调用同步方法时,哪个线程是所有者
  • 哪个螺纹固定锁紧螺纹测试或第二个螺纹
  • 在这里释放锁是什么意思obj.wait();方法一旦锁被释放,在前一个线程得到通知之前,同一个对象能否进入同步块和访问代码 (加粗):

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

    • 其他一些线程调用此对象和线程的notify方法 T恰好被任意选择为要唤醒的线程
    • 其他一些线程为此对象调用notifyAll方法
    • 另一个线程中断了线程T
    • 指定的实时时间已过,或多或少。但是,如果超时为零,则不考虑实时性 线程只需等待通知
    然后从该对象的等待集中删除线程T,并 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上同步的权限;一旦 已获得对对象的控制,其所有同步声明 对象恢复到原来的状态,即 在调用wait方法时的情况。螺纹T 然后从wait方法的调用返回。因此,作为回报 在wait方法中,对象的同步状态和 线程T与调用wait方法时完全相同

    因此,在您的示例中:

  • 一个线程进入您的
    run()
    方法,然后等待获得对
    obj
    的锁定
  • 一旦获得该锁,它将进入
    obj.wait()
    ,并释放对
    obj()的锁
  • 当它醒来时(出于上述四个原因之一),它等待在
    obj
    上获得锁,然后从
    obj.wait()
    返回
  • “哪个线程持有锁?”的答案完全取决于检查对象的时间。如果您的所有线程都阻塞在
    obj.wait()
    中等待唤醒,则没有线程持有锁。

    (我的粗体):

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

    • 其他一些线程调用此对象和线程的notify方法 T恰好被任意选择为要唤醒的线程
    • 其他一些线程为此对象调用notifyAll方法
    • 另一个线程中断了线程T
    • 指定的实时时间已过,或多或少。但是,如果超时为零,则不考虑实时性 线程只需等待通知
    然后从该对象的等待集中删除线程T,并 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上同步的权限;一旦 已获得对对象的控制,其所有同步声明 对象恢复到原来的状态,即 在调用wait方法时的情况。螺纹T 然后从wait方法的调用返回。因此,作为回报 在wait方法中,对象的同步状态和 线程T与调用wait方法时完全相同

    因此,在您的示例中:

  • 一个线程进入您的
    run()
    方法,然后等待获得对
    obj
    的锁定
  • 一旦获得该锁,它将进入
    obj.wait()
    ,并释放对
    obj()的锁
  • 当它醒来时(出于上述四个原因之一),它等待在
    obj
    上获得锁,然后从
    obj.wait()
    返回
  • “哪个线程持有锁?”的答案完全取决于检查对象的时间。如果所有线程都在
    obj.wait()
    中阻塞等待唤醒,则没有线程持有锁

  • 调用同步方法时,哪个线程是所有者
  • 进入
    synchronized
    块的线程

  • 哪个螺纹固定锁紧螺纹测试或第二个螺纹
  • 进入
    synchronized
    块的线程

  • 在这里释放锁是什么意思
    obj.wait()意味着什么
  • 这意味着锁被释放。这似乎非常清楚。不清楚你在问什么

    一旦锁被释放,同一个对象能否进入同步块和访问代码

    直到前一个线程得到通知

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

  • 调用同步方法时,哪个线程是所有者
  • 进入
    synchronized
    块的线程

  • 哪个螺纹固定锁紧螺纹测试或第二个螺纹
  • 进入
    synchronized
    块的线程

  • 在这里释放锁是什么意思
    obj.wait()意味着什么
  • 这意味着锁被释放。这似乎非常清楚。不清楚你在问什么

    一旦锁被释放,同一个对象能否进入同步块和访问代码

    直到前一个线程得到通知<
    public final void wait(long timeout)
                throws InterruptedException