為什么synchronized無法禁止指令重排,卻能保證有序性


為了進一步提升計算機各方面能力,在硬件層面做了很多優化,如處理器優化和指令重排等,但是這些技術的引入就會導致有序性問題。

先告訴面試官你知道什么是有序性問題,也知道是什么原因導致的有序性問題

我們也知道,最好的解決有序性問題的辦法,就是禁止處理器優化和指令重排,就像volatile中使用內存屏障一樣。

表明你知道啥是指令重排,也知道他的實現原理

但是,雖然很多硬件都會為了優化做一些重排,但是在Java中,不管怎么排序,都不能影響單線程程序的執行結果。這就是as-if-serial語義,所有硬件優化的前提都是必須遵守as-if-serial語義。

重點!解釋下什么是as-if-serial語義,因為這是這道題的第一個關鍵詞,答上來就對了一半了

再說下synchronized,他是Java提供的鎖,可以通過他對Java中的對象加鎖,並且他是一種排他的、可重入的鎖。

裝X項,不留痕跡的展示自己對鎖了解的比較多

所以,當某個線程執行到一段被synchronized修飾的代碼之前,會先進行加鎖,執行完之后再進行解鎖。在加鎖之后,解鎖之前,其他線程是無法再次獲得鎖的,只有這條加鎖線程可以重復獲得該鎖。

介紹synchronized的原理,這是本題的第二個關鍵點,到這里基本就可以拿滿分了。

 

synchronized通過排他鎖的方式就保證了同一時間內,被synchronized修飾的代碼是單線程執行的。所以呢,這就滿足了as-if-serial語義的一個關鍵前提,那就是單線程,因為有as-if-serial語義保證,單線程的有序性就天然存在了。

 

 

轉發自:https://blog.csdn.net/singwhatiwanna/article/details/104421561/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM