将多个对象锁定在Java中



i有一个位置执行特定的代码,没有其他试图访问上述2个实例处于等待状态的其他线程。使用同步或锁定,我们可以在一个实例上获取锁定,并将同步块嵌套在2个对象上也不是一个好主意。

synchronized(obj1){
 synchronized(obj2){
 }
}

另一个潜在的问题是,在某些情况下,即使内部对象OBJ2是免费的,因为外部对象已锁定,线程不断等待。什么可能是解决此问题的最佳解决方案。

嵌套锁的风险僵局 当两个不同的线程以不同的顺序锁定。

没有消除此类僵局的普遍方法。可能的解决方案包括:

  1. 维护锁定对象的总顺序仅按照对象的升序获取锁(或仅按降序)。

    这是对案例的好解决方案,当两个锁定对象都无需锁定一个对象时,这是一个很好的解决方案。

  2. 使用tryLock内锁机制。

    tryLock如果对象已经被另一个线程锁定,则立即返回false。因此程序应以某种方式处理这种情况。

最新更新