繁体   English   中英

Java的“同步”块是否锁定对象引用或值?

[英]Does Java `synchronized` block lock on Object reference, or value?

给出如下所示的输出:

    Path path1 = Paths.get("/Users/someone/foo");
    Path path2 = Paths.get("/Users/someone/foo");
    System.out.println(path1.toString() == path2.toString()); // outputs false
    System.out.println(path1.toString().equals(path2.toString())); // outputs true

给定以下两个线程,两个线程是否可能同时在关键部分中运行?

    // Thread 1
    synchronized (path1.toString()) {
        // Critical section
    }

    // Thread 2
    synchronized (path2.toString()) {
        // Critical section
    }

参考值。 这是没有区别的区别。 toString()是一个引用。 除非两个都已被实习,或者它们都源自相同或相同的字符串文字,否则它将与任何其他toString()值相同。

如《 Java语言规范》第14.19节 (JLS)中所述, synchronized语句锁定在对象上。 如果您将“值”视为字符串值(例如path1.toString().equals(path2.toString()) ),则答案为“否” —您的代码几乎肯定不是线程安全的。 用JLS的话来说,如果表达式的类型是引用类型(对于synchronized语句是必需的),则该表达式的可以为null或对象。 除非两个toString()调用返回相同的对象引用( path1.toString() == path2.toString() ),否则已发布代码中的两个块并不互斥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM