同步块内的同步块

时间:2014-03-13 17:13:33

标签: java multithreading synchronization

我可以在另一个中包含一个同步块来同步另一个对象吗?

示例:

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

如果是这样,它仍然是一种正确的技术还是风险太大?

2 个答案:

答案 0 :(得分:10)

如果你在其他地方以相同的顺序进行同步,那就没问题了。

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

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

你可能会陷入僵局。

假设上述变量引用相同的对象,请考虑以下情况。第一个线程(您的代码)将监视器锁定在myObjetc1上。线程调度程序切换线程上下文。第二个线程(上面的代码)将监视器锁定在myObjetc2上。线程调度程序切换线程上下文。第一个线程尝试在myObjetc2上锁定监视器。它必须等待,因为第二个线程有它。线程调度程序切换上下文。第二个线程尝试将监视器锁定在myObjetc1上。它必须等待,因为第一个线程有它。繁荣!死锁。

答案 1 :(得分:1)

是的,你可以做到。

直到您遵循锁定规则并且这样做才能解决您的要求,即罚款。

然而,很多时候这样的事情会引起DeadLock问题,如果做错了。