1. 程式人生 > >可見性有序性,Happens-before來搞定

可見性有序性,Happens-before來搞定

寫在前面

上一篇文章併發 Bug 之源有三,請睜大眼睛看清它們 談到了可見性/原子性/有序性三個問題,這些問題通常違揹我們的直覺和思考模式,也就導致了很多併發 Bug

  • 為了解決 CPU,記憶體,IO 的短板,增加了快取,但這導致了可見性問題
  • 編譯器/處理器擅自優化 ( Java程式碼在編譯後會變成 Java 位元組碼, 位元組碼被類載入器載入到 JVM 裡, JVM 執行位元組碼, 最終需要轉化為彙編指令在 CPU 上執行) ,導致有序性問題

初衷是好的,但引發了新問題,最有效的辦法就禁止快取和編譯優化,問題雖然能解決,但「又回到最初的起點,呆呆地站在鏡子前」是很尷尬的,我們程式的效能就堪憂了.

解決方案

  1. 作為我們程式猿不想寫出 bug 影響 KPI,所以希望記憶體模型易於理解、易於程式設計。這就需要基於一個強記憶體模型來編寫程式碼
  2. 作為編譯器和處理器不想讓外人說它處理速度很慢,所以希望記憶體模型對他們束縛越少越好,可以由他們擅自優化,這就需要基於一個弱記憶體模型

俗話說:「沒有什麼事是開會解決不了的,如果有,那就再開一次」