我們來看下多核多線程是如何執行 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;
重排序只要求最終一致性!