[英]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.