【问题标题】:Does synchronised method releases lock while going into unsynchronised block?进入非同步块时,同步方法是否会释放锁定?
【发布时间】:2014-06-07 02:30:00
【问题描述】:

我有一个同步方法 A() 正在锁定类,并在其主体中调用另外两个非同步方法 B() 和 C()。我的问题是,当控制从 A() 移动到 B() 时,它会释放类上的锁,并且在 B 执行完成后控制权返回时会重新获取它。

synchronised A(){
      //will lock be released here?
      b();
      //will lock be reacquired here?
      c();
}

B(){
   will lock be available here?
//do somthing
}

C(){
//do something
}

请帮忙。提前致谢。

【问题讨论】:

  • 看看这是否有帮助 - stackoverflow.com/questions/9525882/…
  • B() 和 C() 是私有的吗?如果不是,则存在调用 B() 或 C() 并绕过 A() 试图强制执行的同步的危险。这可能是一件坏事。也就是说,在 A() 开始时获得的锁 - 对于调用 A() 的线程 - 将通过 A() 对 B() 和 C() 的调用保留,并在 A() 退出时结束。

标签: java multithreading thread-safety locking synchronisation


【解决方案1】:

在同步块中唯一一次释放和重新获取锁是在调用wait 时。否则锁会一直持有,直到区块退出。

如果其他线程正在调用 B 或 C,则这些线程不会受到 A 上的任何锁定的影响。任何从 A 调用 B 的线程仍将拥有其锁定,但这对于不通过 A 调用 B 的线程无关紧要,他们不会停下来获取锁。

【讨论】:

    【解决方案2】:

    同步块的范围是方法。在 A() 中发生的方法调用是该方法范围的一部分,所以不是。这并不是说 A() 的调用线程和其他一些线程不能同时在 b() 或 c() 中,而是不会在方法 A() 上释放锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2012-03-20
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多