如果你的**所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段**。如果每次執行結果和
單執行緒執行的結果是一樣的,而且其他的
變數的值也和預期的是一樣的,就是執行緒安全的。
或者說:乙個類或者程式所提供的介面對於執行緒來說是
原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。
執行緒安全問題都是由
全域性變數及
靜態變數引起的。
若每個執行緒中對
全域性變數、
靜態變數只有讀操作,而無寫操作,一般來說,這個
全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮
執行緒同步,否則的話就可能影響執行緒安全。
比如乙個 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。這就是「執行緒不安全」了。
文章**
什麼是執行緒安全
執行緒安全現在還沒有明確的定義,有如下通俗的理解記錄如下 當乙個類被多個執行緒進行訪問並且正確執行,它就是執行緒安全的。當多個執行緒訪問某各類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒...
什麼是執行緒安全
首先來介紹下兩個基本的概念,程序和執行緒。執行緒 包含在程序之中,是程序中的實際運作單位。程序通過呼叫執行緒,完成不同的功能。乙個物件是否是執行緒安全的,取決於它是否被多個執行緒同時訪問。其實,與其說執行緒安全,倒不如說資源安全更為貼切。所以對執行緒安全給出乙個確切的定義是非常複雜的,在網上可以搜到...
什麼是執行緒安全 死鎖
1 執行緒安全 每個程序都會被系統分配一塊公共區域,該區域就是堆 記憶體 該程序的所有執行緒都能訪問該堆 記憶體 的資料,在不受限制的情況下存在被意外修改的風險,這就是執行緒安全。存在競爭的執行緒就是不安全的,不存在競爭的執行緒就是安全的。2 死鎖 所謂死鎖是指多個併發執行緒因競爭系統資源而處於互相...