我的印象是wait()释放所有锁,但我发现这篇帖子说的
"在同步方法中调用wait是一种获取内部锁的简单方法"
请澄清我有点困惑.
http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
我需要在一个功能中锁定两个对象,并且当前代码如下所示;
Object obj1 = ...//get from somewhere
Object obj2 = ...//get from somewhere
synchronized(obj1){
...//blah
synchronized(obj2){
...//blah
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,如果另一个线程使用obj1运行这段代码并且两个反转,这是一个简单而直接的死锁配方.
有没有办法使用concurrency-utils锁来避免这种情况?
我正在考虑维护一个物体及其锁的地图,并验证它们是否可以使用,但似乎无法想出一种可以预测锁定顺序的清洁方式.