Java併發-volidate關鍵字

使用volidate關鍵字修飾的成員變量,保證可見性,也就是當一個線程修改這樣的成員變量後,其他的線程能夠立即看到這次的修改。有兩個方面的原因:

1.編譯器不優化對這樣的關鍵字修飾變量的一些訪問操作

2.對讀,寫這個關鍵字修飾的變量前後,會追加內存屏障指令,使其當讀之前,會主動從主存中讀,當寫之後,會使其他的緩存內的這個變量值失效,迫使使用那個緩存的線程再次讀取這個變量時主動從主存中讀取。

爲何volidate關鍵字不保證原子性?

針對這樣的變量的get,set能夠保證原子性,但是針對某些操作無法保證原子性,比如++,--這樣的操作。

使用的方式一般是一個線程修改變量,其餘的線程讀取變量。用作線程間通知的作用。

當初電話面試阿里巴巴的一個開發崗位,對方問了一下多線程的簡單概念,問volatile關鍵字是否能保證線程安全,我說不能,他說爲什麼不能,我答不上來。

現在再次深入學習java併發編程,終於理解爲什麼volatile不能保證線程安全了。

保證線程安全可以有兩種方式

1.原子操作,基本上只能是cas操作才能保證原子操作。

2.線程互斥執行,可以使用鎖來保證線程互斥執行,也就是線程串行執行。

3.變量只被一個線程所讀寫。

知識需要理解,技能需要練習,體系需要建立。

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