JAVA並發圖解

JAVA並發總覽

核心問題

並不是程序的漏洞導致的,而是操作系統底層機制導致的

在這裡插入圖片描述

原子性:

在這裡插入圖片描述

可見性問題:

改的是緩存,但是緩存對另一個線程不可見

在這裡插入圖片描述

有序性問題:

正常應該先創建對象,再賦值;而編譯器對指令執行順序出於某些原因進行瞭優化,然後改變瞭執行順序,如下:

在這裡插入圖片描述

解決方案

可見性:

在這裡插入圖片描述

有序性:

這個原則在加瞭volatile和鎖的時候自動生效,也就是說解決瞭可見性和原子性,可見性順帶就解決瞭

在這裡插入圖片描述

原子性:

操作系統角度,監視器的名字是管程

解決瞭原子性問題,可見性和有序性都能解決

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

並發工具

CAS的方式會出現ABA問題,就是說是被修改瞭兩次而又變回瞭原來的值,但是檢查是沒有變化的,對於引用對象就會出現問題,引用對象地址沒變,但是引用的東西發生瞭變化

在這裡插入圖片描述

其他方案

ThreadLocal,線程是Key,值是線程的數據,每個線程取東西存東西,都是通過線程key區分,來隔離的

在這裡插入圖片描述

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: