我可以在另一个块中包含一个同步块(synchronized block)以同步另一个对象吗?
例子:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果是这样,它仍然是一种正确的技术还是风险太大?
最佳答案
如果您在其他任何地方都以相同的顺序同步就可以了。
如果其他线程要执行以下代码
synchronized(myObjetc2){
// code
synchronized(myObjetc1){
// code
}
}
你可能会陷入僵局。
假设上述变量引用相同的对象,请考虑以下情况。第一个线程(您的代码)将监视器锁定在
myObjetc1
上。线程调度器切换线程上下文。第二个线程(上面的代码)将监视器锁定在 myObjetc2
上。线程调度器切换线程上下文。第一个线程尝试在 myObjetc2
上锁定监视器。它必须等待,因为第二个线程拥有它。线程调度器切换上下文。第二个线程尝试在 myObjetc1
上锁定监视器。它必须等待,因为第一个线程拥有它。繁荣!僵局。关于java - 同步块(synchronized block)内的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22386012/