【发布时间】:2017-07-25 16:00:45
【问题描述】:
给出如下所示的输出:
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
}
【问题讨论】:
-
每个对象都有自己的监视器;这就是同步块获取的内容。因此,只有
path1.toString() == path2.toString()才会出现互斥。 -
一般来说,同步方法调用的结果并不是一个好主意:即使你只在两个线程中同步
path1.toString(),你可能根本不会得到互斥,如果它是总是返回一个新对象(你不知道是不是这样,它可以任意改变)。 -
你当然不能指望这些引用是相同的。他们很可能不会。无论如何,你为什么要锁定
String?String携带大量运费和语义,仅用作锁定对象。你只需要一个Object。
标签: java multithreading synchronization synchronized synchronized-block