i有一个位置执行特定的代码,没有其他试图访问上述2个实例处于等待状态的其他线程。使用同步或锁定,我们可以在一个实例上获取锁定,并将同步块嵌套在2个对象上也不是一个好主意。
synchronized(obj1){
synchronized(obj2){
}
}
另一个潜在的问题是,在某些情况下,即使内部对象OBJ2是免费的,因为外部对象已锁定,线程不断等待。什么可能是解决此问题的最佳解决方案。
嵌套锁的风险僵局 当两个不同的线程以不同的顺序锁定。
没有消除此类僵局的普遍方法。可能的解决方案包括:
-
维护锁定对象的总顺序仅按照对象的升序获取锁(或仅按降序)。
这是对案例的好解决方案,当两个锁定对象都无需锁定一个对象时,这是一个很好的解决方案。
-
使用
tryLock
内锁机制。tryLock
如果对象已经被另一个线程锁定,则立即返回false。因此程序应以某种方式处理这种情况。