Java中的鎖機制是多線程并發編程中常用的一種手段,但是鎖機制也會出現死鎖和活鎖兩種情況。雖然二者都導致了線程阻塞,但是它們是有區別的。
死鎖是指多個線程互相等待對方釋放鎖資源,從而導致所有線程無法繼續執行的一種情況。比如線程A持有鎖A,但是需要鎖B才能完成,而線程B持有鎖B,但是需要鎖A才能完成,兩個線程在等待另一個線程釋放鎖的同時都不會主動釋放自己的鎖,從而就出現了死鎖。
public void methodA(){ synchronized(lockA){ synchronized(lockB){ //需要鎖B才能完成 } } } public void methodB(){ synchronized(lockB){ synchronized(lockA){ //需要鎖A才能完成 } } }
而活鎖則是指某個線程一直嘗試執行某個操作,但總是失敗,從而導致一直不停地重試而無法繼續執行的一種情況。比如一個線程嘗試獲取鎖資源,但是發現鎖已經被其他線程占用,于是就會釋放鎖并再次嘗試獲取鎖。如果這種情況一直發生,就會形成活鎖。
public void method(){ while(true){ try{ synchronized(lock){ //需要執行的操作 } break; }catch(Exception e){ //獲取鎖失敗,不停嘗試 } } }
所以,死鎖和活鎖雖然都是由于多線程編程中的鎖機制引起的,但是死鎖是等待彼此釋放鎖資源,而活鎖則是嘗試獲取鎖資源失敗,不斷重試。