Java` synchronized`是否阻止对象引用或值?

时间:2017-03-05 21:50:28

标签: java multithreading synchronization synchronized synchronized-block

鉴于以下输出:

    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
    }

2 个答案:

答案 0 :(得分:6)

引用的值。这是一个没有区别的区别。 Unit是一个参考。它不会与任何其他23 34 45 54 43 11 49 89 09 33 76 28 44 42 24 30 值相同,除非两者都被实习,或者它们都来自相同或相同的字符串文字。

答案 1 :(得分:3)

Java Language Specification, section 14.19(JLS)中所述,synchronized语句锁定对象。如果您将“value”视为字符串值(如path1.toString().equals(path2.toString())中所示),则回答为“no” - 您的代码几乎肯定不是线程安全的。按照JLS的说法,如果表达式的类型是引用类型(根据synchronized语句的要求),那么该表达式的null或对象。发布的代码中的两个块不是互斥的,除非两个toString()调用返回相同的对象引用(path1.toString() == path2.toString())。