天天看點

線程安全

比如一個 arraylist 類,在添加一個元素的時候,它可能會有兩步來完成:1. 在 items[size] 的位置存放此元素;2. 增大 size 的值。

在單線程運作的情況下,如果 size = 0,添加一個元素後,此元素在位置 0,而且 size=1;

而如果是在多線程情況下,比如有兩個線程,線程 a 先将元素1存放在位置 0。但是此時 cpu 排程線程a暫停,線程 b 得到運作的機會。線程b向此 arraylist 添加元素2,因為此時 size 仍然等于 0 (注意,我們假設的是添加一個元素是要兩個步驟,而線程a僅僅完成了步驟1),是以線程b也将元素存放在位置0。然後線程a和線程b都繼續運作,都增加 size 的值,結果size等于2。

那好,我們來看看 arraylist 的情況,期望的元素應該有2個,而 實際元素是在0位置,造成丢失元素,而且size 等于 2。這就是“線程不安全”了。

繼續閱讀