这个问题源自我问我们技术经理一个多线程问题时,他的回答让我迷惑。我刚开始深入研究多线程,一直认为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,ThirdEditionsection2.2Amonitorisacollectionofprocedures,variables,anddatastructuresthatareallgroupedtogetherinaspecialkindofmoduleorpackage.Processesmaycalltheproceduresinamonitorwhenevertheywantto,buttheycannotdirectlyaccessthemonitor'sinternaldatastructuresfromproceduresdeclaredoutsidethemonitor.Thisrule,whichiscommoninmodernobject-orientedlanguagessuchasJava,wasrelativelyunusualforitstime,althoughobjectscanbetracedbacktoSimula67.
添加回答
举报
0/150
提交
取消