3

我有一个同步方法 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
}

请帮忙。提前致谢。

4

2 回答 2

1

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

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

于 2014-04-22T16:05:33.667 回答
0

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

于 2014-04-22T16:04:10.547 回答