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>同步**塊》同步方法(因為同步方法裡面可能有讀的,不一定全寫的,就造成不能讀了。)
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒不安全 就是不提供資料訪問保護,在多執行緒環境中對資料進行修改,會出現資料不一致的情況。執行緒安全 就是多執行緒環境中有對全域性變數的變動時,需要對執行的 塊採用鎖機制,當乙個執行緒訪問到某個資料時,其他執行緒需要等待當前執行緒執行完該 塊才可執行,不會出現資料不一致或者資料被汙染。如果一段 ...