在AbstractQueuedSynchronizer類中維護了一個用volatile修飾的state狀態(tài),而這個狀態(tài)有如下的兩種修改方法:
state的set方法:
protected final void setState(int newState) {
state = newState;
}
CAS方法:
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
那么,我的疑問來了,不是說volatile修飾的變量在多線程的單操作中,能夠保證其寫后讀的可見性,即能保證線程安全,為什么還提供了CAS操作能保證線程安全呢?還是我的理解有問題呢?謝謝各位大牛了!
2 回答

鴻蒙傳說
TA貢獻1865條經(jīng)驗 獲得超7個贊
是的,你的理解有問題。
不是說volatile修飾的變量在多線程的單操作中,能夠保證其寫后讀的可見性,即能保證線程安全
能夠保證可見性,不意味著可以保證線程安全。可見性跟線程安全不是同一個概念。
cas操作,可以劃分為幾個小操作
比較 expect 和 state 變量當前的值,如果相同,繼續(xù)2,如果不同,方法結(jié)束。
為 state 賦值 update
這兩個操作,如果是多線程并發(fā)調(diào)用,是會有線程安全問題的。
這里的 cas 方法利用了 cpu 的 cas 指令,這個指令是原子操作??梢员苊獠l(fā)問題。
添加回答
舉報
0/150
提交
取消