執行緒安全與不安全

2021-10-05 14:18:28 字數 2316 閱讀 2314

list介面下面有兩個實現

乙個是arraylist

另外乙個是vector

從原始碼的角度來看

vector的方法前加了,synchronized 關鍵字,也就是同步的意思,sun公司希望vector是執行緒安全的,而希望arraylist是高效的,缺點就是另外的優點。

在 items[size] 的位置存放此元素;

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

public

class

unsafelist).

start()

;}trycatch

(interruptedexception e)

system.out.

println

("list的大小是:"

+list.

size()

);}}

結果,list的大小不一定為100.這就是不安全。

同步方法

每個物件都有乙個鎖

方法前面用sychronized修飾,預設鎖的是this

同步**塊

sychronized(obj)
obj 稱為同步監視器,

obj可以是任何物件,一般為共享資源作為。

同步方法無需指定obj,預設是this,這個物件本身。

同步監視器執行過程

第乙個執行緒訪問,鎖定同步監視器,執行其中的**

第二個執行緒訪問,發現鎖住了,無法訪問

第乙個執行緒訪問完畢,解鎖監視器

第二個執行緒訪問,發現沒有鎖,然後鎖定進行訪問

public

class

juctest).

start()

;}trycatch

(interruptedexception e)

system.out.

println

(list.

size()

);}}

同步的,因為 copyonwritearraylist的add方法是確保安全的。

分析

sychronized和lock對比

lock顯示鎖,必須手動加鎖解鎖,sychronized自動鎖,隱式鎖

lock只有**塊鎖,sychronized有方法鎖和**塊鎖

lock鎖,jvm花費較少的時間來進行排程 ,效能更好

優先使用順序

lock>同步**塊》同步方法(因為同步方法裡面可能有讀的,不一定全寫的,就造成不能讀了。)

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒不安全 就是不提供資料訪問保護,在多執行緒環境中對資料進行修改,會出現資料不一致的情況。執行緒安全 就是多執行緒環境中有對全域性變數的變動時,需要對執行的 塊採用鎖機制,當乙個執行緒訪問到某個資料時,其他執行緒需要等待當前執行緒執行完該 塊才可執行,不會出現資料不一致或者資料被汙染。如果一段 ...