在同步块内部嵌套同步块

3

我能在一个同步块中再嵌套另一个同步块以同步另一个对象吗?

示例:

synchronized(myObjetc1){
    // code
    synchronized(myObjetc2){
        // code         
    }           
}

如果是这样,那么这种技术是否正确或者过于冒险呢?

当您开始嵌套同步块时,需要非常小心(并评估是否使用锁更安全)。 - assylias
详细信息可以在Java并发教程中找到:http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html - SubOptimal
2个回答

15

如果你在其他地方以相同的顺序进行同步,那么这将是好的。

如果其他线程执行以下代码

synchronized(myObjetc2){
    // code
    synchronized(myObjetc1){
        // code         
    }           
}

你可能会遇到死锁问题。

假设上面的变量引用相同对象,考虑以下情况。第一个线程(你的代码)锁定了myObjetc1上的监视器。线程调度器切换了线程上下文。第二个线程(上面的代码)锁定了myObjetc2上的监视器。线程调度器再次切换了线程上下文。第一个线程尝试锁定myObjetc2上的监视器。由于第二个线程已经占用,所以它必须等待。线程调度器又一次切换了线程上下文。第二个线程尝试锁定myObjetc1上的监视器。因为第一个线程已经占用,所以它也必须等待。Boom!死锁。


1

是的,您可以做到。

只要您遵循锁定规则并且这样做可以解决您的需求,那就没问题。

然而,如果不正确地执行,类似操作往往会引发死锁问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接