给出下面的输出结果:
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()
的情况下才会有互斥。 - Andy Turnerpath1.toString()
,如果它总是返回一个新对象(你不知道是否是这种情况,而且它可能会任意更改),你可能根本没有互斥。 - Andy TurnerString
?String
携带了大量的负载和语义,仅仅作为锁对象使用。你只需要一个Object
。 - Lew Bloch