Java內存模型之happens-before和重排序

重排序

在執行程序時,爲了提供性能,處理器和編譯器經常會對指令進行重排序,知足如下兩個條件:併發

  1. 在單線程環境下不能改變程序運行的結果;
  2. 存在數據依賴關係的不容許重排序

happens - before

原則定義

    1. 若是一個操做happens-before另外一個操做,那麼第一個操做的執行結果將對第二個操做可見,並且第一個操做的執行順序排在第二個操做以前。
    1. 兩個操做之間存在happens-before關係,並不意味着必定要按照happens-before原則制定的順序來執行。若是重排序以後的執行結果與按照happens-before關係來執行的結果一致,那麼這種重排序並不非法。

原則規則

  1. 程序次序規則:一個線程內,按照代碼順序,書寫在前面的操做先行發生於書寫在後面的操做;
  2. 鎖定規則:一個unLock操做先行發生於後面對同一個鎖額lock操做;
  3. volatile變量規則:對一個變量的寫操做先行發生於後面對這個變量的讀操做;
  4. 傳遞規則:若是操做A先行發生於操做B,而操做B又先行發生於操做C,則能夠得出操做A先行發生於操做C;
  5. 線程啓動規則:Thread對象的start()方法先行發生於此線程的每一個一個動做;
  6. 線程中斷規則:對線程interrupt()方法的調用先行發生於被中斷線程的代碼檢測到中斷事件的發生;
  7. 線程終結規則:線程中全部的操做都先行發生於線程的終止檢測,咱們能夠經過Thread.join()方法結束、Thread.isAlive()的返回值手段檢測到線程已經終止執行;
  8. 對象終結規則:一個對象的初始化完成先行發生於他的finalize()方法的開始;

連接

【死磕Java併發】—–Java內存模型之重排序app

【死磕Java併發】—–Java內存模型之happens-before性能

相關文章
相關標籤/搜索