鉴于以下输出:
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
}
答案 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()
)。