多線程3 - 併發編程(原子性、可見性、有序性)

我們來看下多核多線程是如何執行 i+1操作的

主函數:i = i + 1;

                          cache1 :  i =  1

                          cache2 : i = 1 

                          線程1 : CPU1  main memory -> i -> cache1 [ i + 1 ] -> cache1 -> main memory

                          線程2 :   CPU2  main memory ->  i -> cache2 [ i ]  -> cache2 一直拿着值是1 而cache1一直在更新緩存數據但是沒有把緩存區的數據更新置主內存!

爲了解決緩存不一致的情況:

1 給數據總線加鎖!

           總線:數據總線、地址總線、控制總線

           LOCK# [同時只有一個cpu一個線程可以拿到鎖!]

           缺點: 串行化,導致線程執行變慢!

2 CPU高速緩存一致性協議

          Intel 提出的協議:[ MESI ]

          1 核心思想:

               當CPU寫入數據的時候,發現該變量被內存共享【存在副本】。會發出一個信號,通知其他線程該緩存無效!

JMM(java memory model)

3 併發編程:

   1 原子性:

         操作不能被中斷![一個操作/多個操作 要麼成功,要麼全失敗,不能因爲其他因素中斷]

   2 可見性:

         一個操作修改了變量,那麼其他操作會看到該變量的新值!

  3 有序性(順序執行):

         int i = 0; 

        boolean flag = false;

        i = 1

        flag = true;

        重排序只要求最終一致性!                

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章