什麼是執行緒安全和執行緒不安全

2022-03-04 06:48:49 字數 1093 閱讀 7460

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。這就是「執行緒不安全」了

什麼是執行緒安全和執行緒不安全

首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...

什麼是執行緒安全和執行緒不安全

首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...

什麼是執行緒安全和執行緒不安全

首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...