下面給出所示的輸出:在對象引用或值上Java「同步」塊鎖定嗎?
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'帶有大量的貨運和語義,僅僅用作鎖對象。你只需要一個「對象」。 –