[英]A use-case for synchronized(new Object())
在最近的答案我認為這是可以實現的功能的volatile
通過synchronizing
含有我們需要的變量的對象volatile
(提問者沒有訪問變量的代碼)。
這讓我覺得我實際上不需要阻塞包含對象,我只需要實現內存屏障。 由於synchronized
實現了同步和內存屏障,如果我只需要內存屏障(如本例所示),那么使用synchronized(new Object())
來實現我的內存屏障並確保鎖永遠不會爭用它實際上會更好?
如下所述: http : //www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization synchronized(new Object())被認為是noop,可以完全刪除編譯器。 你不會從中獲得內存障礙。
使用
synchronized(new Object())
來實現我的內存屏障並確保永遠不會爭用鎖定會更好嗎?
NOP。 JVM可以很容易地證明這個鎖不能被兩個線程訪問(因為它是一個線程局部變量)並且幾乎肯定會把它變成無操作,即完全刪除synchronized
語句。
除了@ assylias的非常好的觀點之外,還要考慮synchronized
不會通過規范實現內存屏障。 只有這樣才能在今天典型的CPU內存架構上實現它。 規范只保證當兩個線程獲得相同的鎖時會發生什么。
無論如何,如果你不關心規范,但只關心實際的實現,那么為什么不引入你自己的volatile
變量,只要你想要一個內存屏障就可以寫入它? 這是無關緊要的,其 volatile
你寫不出來,只要我們在談論一組受限的架構是由你的暗示synchronized(new Object())
的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.