java - 通过同步方法返回值同步块(synchronized block)的跨度

标签 java multithreading synchronization synchronized

我有一个如下所示的同步方法:

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/

相关文章:

winapi - InterlockedPushListSList丢失。它在哪里?

java - 使用可选处理 java 流中的 null

java - 使用 SAX 解析 Java 中的自定义 XML 响应

java - 尝试通过远程计算机连接到数据库时 SQL 服务器连接被拒绝

java - newCachedThreadPool 是如何复用线程的?

java - 如何使 Java 线程挂起

iphone - 是否可以将多个核心数据模型文件添加到一个 Xcode 项目中?

java - java类中使用的常量放在哪里?

java - java 子线程数组访问

c# - C# .NET 中具有多个监听器的线程一次性变量赋值