我能在一个同步块中再嵌套另一个同步块以同步另一个对象吗?
示例:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果是这样,那么这种技术是否正确或者过于冒险呢?
我能在一个同步块中再嵌套另一个同步块以同步另一个对象吗?
示例:
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
如果你在其他地方以相同的顺序进行同步,那么这将是好的。
如果其他线程执行以下代码
synchronized(myObjetc2){
// code
synchronized(myObjetc1){
// code
}
}
你可能会遇到死锁问题。
假设上面的变量引用相同对象,考虑以下情况。第一个线程(你的代码)锁定了myObjetc1
上的监视器。线程调度器切换了线程上下文。第二个线程(上面的代码)锁定了myObjetc2
上的监视器。线程调度器再次切换了线程上下文。第一个线程尝试锁定myObjetc2
上的监视器。由于第二个线程已经占用,所以它必须等待。线程调度器又一次切换了线程上下文。第二个线程尝试锁定myObjetc1
上的监视器。因为第一个线程已经占用,所以它也必须等待。Boom!死锁。
是的,您可以做到。
只要您遵循锁定规则并且这样做可以解决您的需求,那就没问题。
然而,如果不正确地执行,类似操作往往会引发死锁问题。