1、線程安全概念
當多個線程訪問某一個類(對象或方法)時蛮位,這個類始終能表現(xiàn)出正確的行為较沪,那么這個類(對象或方法)就是線程安全的鳞绕。
synchronized
加鎖的代碼塊稱為“互斥區(qū)”或“臨界區(qū)”。
鎖競爭的問題尸曼,導致CPU使用率非常高们何,性能非常慢,宕機控轿。
對象鎖與類鎖(靜態(tài)方法上加synchronized
冤竹,類獨占)。
2解幽、對象鎖的同步與異步
同步的需要線程去排隊
同步的目的是為了線程安全贴见,對于線程安全來說,需要滿足:
(1)原子性(同步)
A線程先持有object
對象的Lock
鎖躲株,B線程如果在這個時候調(diào)用對象中的同步(synchronized
)方法片部,則需要等待,也就是同步霜定。
A線程先持有object
對象的Lock
鎖档悠,B線程可以以異步的方式調(diào)用對象中的非同步方法。
(2)可見性
3望浩、臟讀
對于對象的同步和異步的方法辖所,設(shè)計自己的程序時候,要考慮業(yè)務(wù)問題的整體磨德,不然會出現(xiàn)數(shù)據(jù)不一致的錯誤缘回。
ACID
:Oracle一致性讀,9:00一刻的數(shù)據(jù)典挑,發(fā)起select
查詢酥宴,即使9:10分才查出來,9:05進行了更新您觉,9:10分查詢時拙寡,發(fā)現(xiàn)undo
有變化了,會去undo
中查詢出來琳水,絕對不會查詢新值肆糕。如果客戶端并發(fā)導致undo
丟失了,會拋snapshot too old
在孝。
4诚啃、synchronized鎖重入
當一個線程得到一個對象的鎖后,再次請求此對象時是可以再次得到該對象的鎖私沮。(父子繼承關(guān)系也可以)始赎。
多線程處理多個任務(wù)中,要求同時成功或同時失敗時,如中間出現(xiàn)異常時极阅,可以printstackStrace
打印日志不進行中斷,或者throw new RuntimeException
進行中斷涨享。
碰到異常筋搏,鎖會立即釋放,其他線程會進入厕隧,需要正確處理異常奔脐。如果對象由于線程未正確而釋放了鎖,可能會對后續(xù)的對象執(zhí)行都是錯誤的處理邏輯吁讨。
PS:數(shù)據(jù)庫中的存儲過程髓迎,begin
與end
中才可以加exception when
5、不要使用"abc"這種作為鎖對象
常量池中會造成死循環(huán)建丧;可以使用new String("abc")
private String lock="lock"
作為鎖對象后排龄,不能進行更改該lock
,修改后翎朱,會引發(fā)鎖釋放橄维。
但如果是對象作為鎖對象,修改屬性不影響鎖的持有拴曲。