JAVA並發圖解
JAVA並發總覽
核心問題
並不是程序的漏洞導致的,而是操作系統底層機制導致的
原子性:
可見性問題:
改的是緩存,但是緩存對另一個線程不可見
有序性問題:
正常應該先創建對象,再賦值;而編譯器對指令執行順序出於某些原因進行瞭優化,然後改變瞭執行順序,如下:
解決方案
可見性:
有序性:
這個原則在加瞭volatile和鎖的時候自動生效,也就是說解決瞭可見性和原子性,可見性順帶就解決瞭
原子性:
操作系統角度,監視器的名字是管程
解決瞭原子性問題,可見性和有序性都能解決
並發工具
CAS的方式會出現ABA問題,就是說是被修改瞭兩次而又變回瞭原來的值,但是檢查是沒有變化的,對於引用對象就會出現問題,引用對象地址沒變,但是引用的東西發生瞭變化
其他方案
ThreadLocal,線程是Key,值是線程的數據,每個線程取東西存東西,都是通過線程key區分,來隔離的
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 創建Java線程安全類的七種方法
- Java並發編程變量可見性避免指令重排使用詳解
- 面試官:java ThreadLocal真的會造成內存泄露嗎
- Java並發編程之Volatile變量詳解分析
- JAVA並發中VOLATILE關鍵字的神奇之處詳解