併發線程的三個重要概念

併發線程的三個重要概念

1 原子性

對基本數據類型的變量讀取和賦值是保證了原子性的,要麼都成功,要麼都失敗,這些操作不可中斷。

比如 i = 10

a = 10 原子性
b=a 不滿足 read a , 賦值 b
c++ 不滿足 read c ; add , 賦值 c
c=c+1 不滿足 read c;add; 賦值 c

2 可見性

	可以使用volatile 關鍵字保證可見性

	什麼是可見性,兩個線程分別從主內存中獲取數據,緩存到自己緩存區中,一個線程對數據進行改變了,另一個線程立馬可以感應到,這叫做可見性,可以使用volatile 關鍵字進行修飾所操作的數據。

3 有序性

	happens-before relationship 原則

1 代碼的執行順序,編寫的前的發生在編寫後面的
2 unlock 必須發生在lock後
3 volatile 修飾的變量,對一個變量的寫操作先於讀操作
3 傳遞規則,操作A先於B,B先於C,那麼A肯定先於C
4 線程啓動規則,start先於run
5 線程中斷規則,interrupt 這個動作,必須發生在捕獲該動作之前。
6 對象銷燬規則,初始化發生在finalize之前
7 線程中介規則,所有的操作都發生在線程死亡之前

Volatile 關鍵字

1 保證重排序的是不會把指令放到屏障的前面,也不會把前面的放在後面。

2 強制對緩存的修改操作立刻寫入主內存。

3 如果是寫操作,它會導致其他Cpu中的緩存失效。

一旦一個貢獻變量被volatile修飾,具備兩層含義

1 保證了不同線程間的可見性
2 禁止對其進行重排序,也就是保證了有序性
3 並未保證原子性

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