什麼是執行緒安全和執行緒不安全
1.可以這樣理解,加鎖的就是安全的,不加鎖的就是不安全的(感覺比較生動,不知道對不對,望指出)
2.到底是什麼意思呢?
如果你的程式碼所在的程式中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。
好比你有兩個一模一樣的銀行卡(賬戶一樣,餘額一樣,當然現實中是沒有的),假如卡上餘額1000塊,而你跟你女朋友同時在不同的ATM上面取1000塊錢(是同時哦,理想中的同時),如果執行緒不安全,那麼倆人都能同時取出1000塊(賺死了)。而如果執行緒安全的話,只能一個人同時操作一個賬戶,當這個賬戶正在被操作時,是被鎖起來的,不給別人動的,只能你自己動,你動完了別人才能動。
3.為什麼會有執行緒安全問題?
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。
安全性:
比如一個 ArrayList 類,在新增一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1;
而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B也向此 ArrayList 新增元素,因為此時 Size 仍然等於 0 (注意哦,我們假設的是新增一個元素是要兩個步驟哦,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值。
那好,我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等於 2。這就是“執行緒不安全”了
相關文章
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件
- 為什麼?為什麼StringBuilder是執行緒不安全的?UI執行緒
- 29-HashMap 為什麼是執行緒不安全的?HashMap執行緒
- 什麼是Python執行緒?Python執行緒如何建立?Python執行緒
- HashMap為何執行緒不安全HashMap執行緒
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 什麼是程式、執行緒和協程?執行緒
- 執行緒和執行緒池執行緒
- 什麼是程式(執行緒)同步執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- ArrayList執行緒不安全怎麼辦?(CopyOnWriteArrayList詳解)執行緒
- 為什麼 Random.Shared 是執行緒安全的random執行緒
- 執行緒安全執行緒
- SimpleDateFormat一定是執行緒不安全嗎?ORM執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多執行緒和多執行緒同步執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- JDK21的虛擬執行緒是什麼?和平臺執行緒什麼關係?JDK執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 執行緒安全(二)執行緒
- Java執行緒安全Java執行緒
- Web Worker執行緒的限制是什麼?Web執行緒
- 舉例理解什麼是程式,執行緒執行緒
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 為什麼 Go map 和 slice 是非執行緒安全的?Go執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- iOS開發基礎——執行緒安全(執行緒鎖)iOS執行緒