我有一个假设,在第2类的多个实例中经历一个操作,导致两者的状态更改,因为这是一个多线程应用程序,我想确保除非执行特定的代码,否则试图访问任何上述2个实例的其他线程处于等待状态。 使用synchronized或lock,我们可以获取单个实例上的锁定,并将同步块嵌套在2个对象上也不是一个好主意。
synchronized(obj1){
synchronized(obj2){
}
}
另一个潜在的问题是,即使内部对象obj2是空闲的,也可能存在这样的情况,因为外部对象被锁定,线程一直在等待。 什么是解决这个问题的最佳解决方案。
答案 0 :(得分:1)
当两个不同的线程aqcuire以不同的顺序锁定时,嵌套锁会带来死锁的风险。
没有通用的方法可以消除这种死锁。可能的解决方案包括:
维护锁定对象的总顺序,并仅按对象的升序(或仅按降序)获取锁定。
这是一个很好的解决方案,当已知两个锁定对象而无需锁定其中一个对象时。
使用php artisan migrate:refresh --seed
机制进行内锁。
tryLock
会立即返回false。所以程序应该以某种方式处理这个案例。