如何理解Java Thread中的wait和notify方法?

我对这两个描述非常困惑:

>“wait方法阻塞调用线程并放弃监视器锁定”
>“notify方法解除阻塞一个等待线程但不放弃监视器锁定”

这是我的问题:

>我知道Java中的每个对象都有一个锁,但“监视器锁”是什么意思?是否与oject的锁相同?
>为什么通知方法需要放弃显示器锁定?
>如果我尝试使用以下代码使对象等待:

class simpleTask extends Thread
{
    int waitingTime;

    public simpleTask(int waitingTime)
    {
        this.waitingTime = waitingTime;
    }

    public void run()
    {
        synchronized(this) // this is a reference of current object
        {
        try {
            this.wait(waitingTime);
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

像上面的第一个描述一样,是指当前对象被synchronized关键字阻塞,然后wait方法释放锁?

解决方法

I know each object in Java has a lock,but what is the “monitor lock” means? is it the same as the object’s lock?

是的,他们是一回事.它们偶尔也被称为对象的“互斥体”和对象的“原始锁定”. (但是当有人谈论Lock时,他们正在谈论this Java interface ……这是一种不同的锁定机制.)

Why notify method needs to give up the monitor lock?

notify方法不会放弃锁定.在通知调用返回后,您的代码有责任放弃锁定(即保留同步块或从synchronized方法返回).

为什么这有必要?因为当前正在等待该锁定的任何其他线程(在等待(…)调用中)必须在等待调用完成之前重新获取该锁定.

他们为什么设计这样的通知/等待?这样它们就可以用来实现条件变量.

Like the first description above,is that means the the current object is blocked by synchronized keyword,and then wait method releases the lock?

那是正确的.当一个线程调用someObject.wait()时,它释放someObject的锁定…然后在wait()调用返回之前重新获取(由同一个线程).当然,在此期间,锁定someObject可能已被其他线程多次获取和释放.关键是当wait返回时,调用wait的线程将拥有锁.

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...