我有一个如下所示的同步方法:
static Object foo (Map m, String key) {
synchronized (m) {
//...
return m.get(key);
}
}
和另一个调用此方法的方法:
static void bar (Map m, Stirng key) {
synchronized (foo (m,key) ) {
//Is m still synchronized locked here?
//...
}
}
我的问题如上。由于synchronized block 在foo的返回值上,我想知道这些问题的答案:
- 只有 m 同步?
- 只有 m.get(key) 同步了吗?
- m 和 m.get(key) 都同步了吗?
最佳答案
在这种情况下,
synchronized (foo (m,key) ) {
/* Critical section. */
}
…在临界区,线程只持有m.get(key)
的结果 线程确实获得了m
的锁,但是它在从 foo()
关于java - 通过同步方法返回值同步块(synchronized block)的跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954776/