我可以在另一个中包含一个同步块来同步另一个对象吗?
示例:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果是这样,它仍然是一种正确的技术还是风险太大?
答案 0 :(得分:10)
如果你在其他地方以相同的顺序进行同步,那就没问题了。
如果某个其他线程要执行以下代码
synchronized(myObjetc2){
// code
synchronized(myObjetc1){
// code
}
}
你可能会陷入僵局。
假设上述变量引用相同的对象,请考虑以下情况。第一个线程(您的代码)将监视器锁定在myObjetc1
上。线程调度程序切换线程上下文。第二个线程(上面的代码)将监视器锁定在myObjetc2
上。线程调度程序切换线程上下文。第一个线程尝试在myObjetc2
上锁定监视器。它必须等待,因为第二个线程有它。线程调度程序切换上下文。第二个线程尝试将监视器锁定在myObjetc1
上。它必须等待,因为第一个线程有它。繁荣!死锁。
答案 1 :(得分:1)
是的,你可以做到。
直到您遵循锁定规则并且这样做才能解决您的要求,即罚款。
然而,很多时候这样的事情会引起DeadLock问题,如果做错了。