Hao*_*ang 7 java multithreading locking notify wait
我对这两个描述非常困惑:
这是我的问题:
我知道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();
}
}
}
Run Code Online (Sandbox Code Playgroud)与上面的第一个描述一样,是指当前对象被synchronized关键字阻塞,然后wait方法释放锁?
我知道Java中的每个对象都有一个锁,但"监视器锁"是什么意思?它与对象的锁相同吗?
是的,他们是一回事.它们偶尔也被称为对象的"互斥体"和对象的"原始锁定".(但是当有人谈论时Lock,他们正在谈论这个Java接口 ......这是一种不同的锁定机制.)
为什么通知方法需要放弃显示器锁定?
该notify方法不会放弃锁定.在notify调用返回后,您的代码有责任放弃锁定(即保留同步块或从synchronized方法返回).
为什么这有必要?因为当前正在等待该锁定的任何其他线程(在wait(...)呼叫中)必须在wait呼叫完成之前重新获取该锁定.
他们为什么设计notify/ wait喜欢这个?这样它们就可以用来实现条件变量.
与上面的第一个描述一样,是指当前对象被synchronized关键字阻塞,然后wait方法释放锁?
那是正确的.当一个线程调用someObject.wait()其锁定时,someObject释放...然后在wait()调用返回之前重新获取(由同一个线程).当然,与此同时,锁someObject 可能已被其他线程多次获取和释放.关键是当wait返回时,被调用的线程wait将具有锁定.