为了账号安全,请及时绑定邮箱和手机立即绑定

java多线程中Object.wait()和Condition.await()是否会释放当前线程锁占有的锁

java多线程中Object.wait()和Condition.await()是否会释放当前线程锁占有的锁

长风秋雁 2019-04-16 20:26:10
这个问题源自我问我们技术经理一个多线程问题时,他的回答让我迷惑。我刚开始深入研究多线程,一直认为Object.wait()/Condition.await()让当前线程阻塞的同时,也会释放当前线程对该condition对象的锁。在之前的一些测试代码中也显示wait后,线程上的锁被释放了。但是我们经理却坚持当前线程会占用锁。查看Object.wait()API描述如下:Causesthecurrentthreadtowaituntilanotherthreadinvokesthenotify()methodorthenotifyAll()methodforthisobject.Inotherwords,thismethodbehavesexactlyasifitsimplyperformsthecallwait(0).Thecurrentthreadmustownthisobject'smonitor.Thethreadreleasesownershipofthismonitorandwaitsuntilanotherthreadnotifiesthreadswaitingonthisobject'smonitortowakeupeitherthroughacalltothenotifymethodorthenotifyAllmethod.Thethreadthenwaitsuntilitcanre-obtainownershipofthemonitorandresumesexecution.其中“thethreadreleasesownershipofthismonitor”说道当前线程会释放这个对象监控器的所有权。问题一:这里的monitor怎么理解?监视器(monitor)和锁是什么关系?这个monitor就是一个术语,或者是一个特殊的类(只包含私有域),但是在java中并没有严格遵守这个概念。个人认为可以简单的理解为锁。同样的,Condition.await()方法中也有类似描述。ThelockassociatedwiththisConditionisatomicallyreleasedandthecurrentthreadbecomesdisabledforthreadschedulingpurposes...也说道,调用await()有,这个条件对象关联的锁被“原子级地”释放。。。问题二:这个原子级的释放是什么意思?“原子级”其实就是为了保证一个操作的完整性,原子级的释放保证了一个原子操作不会因为线程的突然挂起或者说阻塞而破坏这次操作。这都能说明调用wait()或者await()后,当前线程会释放该条件对象关联的锁吧?!但是我们经理说不会释放又是什么意思?是我的理解太浅显么?还是我们经理错了?希望多线程的资深前辈能不吝赐教!不胜感激
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

你的经理错了 或者你们的沟通有问题吧. 
两个线程用object1做wait/notify,是这样:
thread1得到object1的monitor,调用object1.wait()
-释放object1的monitor,thread1wait;
thread2得到object1的monitor,调用object1.notify()
-激活thread1,释放object1的monitor;
thread1得到object1的monitor,从object1.wait()返回,thread1接着执行.
关于monitor,这个是多进程/线程同步的一个术语,见:OperatingSystemsDesignandImplementation,ThirdEdition
section2.2
Amonitorisacollectionofprocedures,variables,anddata
structuresthatareallgroupedtogetherinaspecialkindofmodule
orpackage.Processesmaycalltheproceduresinamonitorwhenever
theywantto,buttheycannotdirectlyaccessthemonitor'sinternal
datastructuresfromproceduresdeclaredoutsidethemonitor.This
rule,whichiscommoninmodernobject-orientedlanguagessuchas
Java,wasrelativelyunusualforitstime,althoughobjectscanbe
tracedbacktoSimula67.
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 451 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号