【问题标题】:Synchronized block inside synchronized block同步块内的同步块
【发布时间】:2014-03-13 17:13:32
【问题描述】:

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

例子:

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

如果是这样,它是正确的技术还是太冒险了?

【问题讨论】:

标签: java multithreading synchronization


【解决方案1】:

如果你在其他地方以相同的顺序同步就好了。

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

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

你可能会遇到死锁。

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

【讨论】:

    【解决方案2】:

    是的,你可以做到。

    直到您遵循锁定规则并这样做解决了您的要求,这很好。

    但是,如果操作不正确,很多时候这样的事情会引发死锁问题。

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2011-12-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多