多线程:同一两个对象正在进入同步块

时间:2018-08-15 12:43:35

标签: multithreading locking synchronized

可能是我的标题不正确。

我已经通过编程开始了Java多线程概念。由于我已在同步块内部读取,因此只有一个线程会插入特定的对象锁。但是我看了这个程序的输出后感到困惑。 包com.example.classandobjectlevellock;

Class MyThread实现Runnable {     对象ob = new Object();

public void run() {

    synchronized (this) {

        System.out.println(Thread.currentThread().getName()+" Is waitng");
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

}

公共类ClassAndObjectLevelLock {

public static void main(String[] args) throws InterruptedException {

    MyThread task1 =  new MyThread();
    MyThread task2 =  new MyThread();

    Thread t1 = new Thread(task1,"Thread1");
    Thread t2 = new Thread(task1,"Thread2");

    Thread t3 = new Thread(task2,"Thread3");

    t1.start();
    Thread.sleep(1000);
    t2.start();
    Thread.sleep(1000);
    t3.start();

}

}  输出: 线程1是waitng 线程2是waitng Thread3是waitng

如果我没记错的话,线程1和线程3正在进入同步方法,因为它具有两个不同的目标对象。但是,为什么Thread-2进入了同步块?

请帮助我理解这一点。 预先感谢。

1 个答案:

答案 0 :(得分:2)

调用wait()导致锁被释放。

the wait() Javadocs

  

使当前线程等待,直到另一个线程调用   notify()方法或此对象的notifyAll()方法。在   换句话说,此方法的行为就像它只是执行   致电wait(0)

     

当前线程必须拥有此对象的监视器。 线程   释放此监视器的所有权,并等待直到另一个线程   通知在此对象的监视器上等待的线程唤醒   通过调用notify方法或notifyAll方法。的   然后线程等待,直到它可以重新获得监视器的所有权并   恢复执行。