在Java

时间:2017-12-13 08:26:22

标签: java multithreading locking synchronized

我有一个假设,在第2类的多个实例中经历一个操作,导致两者的状态更改,因为这是一个多线程应用程序,我想确保除非执行特定的代码,否则试图访问任何上述2个实例的其他线程处于等待状态。 使用synchronized或lock,我们可以获取单个实例上的锁定,并将同步块嵌套在2个对象上也不是一个好主意。

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

另一个潜在的问题是,即使内部对象obj2是空闲的,也可能存在这样的情况,因为外部对象被锁定,线程一直在等待。 什么是解决这个问题的最佳解决方案。

1 个答案:

答案 0 :(得分:1)

当两个不同的线程aqcuire以不同的顺序锁定时,嵌套锁会带来死锁的风险。

没有通用的方法可以消除这种死锁。可能的解决方案包括:

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

    这是一个很好的解决方案,当已知两个锁定对象而无需锁定其中一个对象时。

  2. 使用php artisan migrate:refresh --seed 机制进行内锁。

    如果对象已被另一个线程锁定,

    tryLock会立即返回false。所以程序应该以某种方式处理这个案例。