只有拿到轉出賬戶和轉入賬戶的資源,才能轉賬成功。首先嘗試鎖定轉出賬戶this,然後嘗試鎖定轉入賬戶target,只有兩者都成功時,才可以執行轉賬操作。
class account }}
} }
細粒度鎖:可以提高並行度,效能優化的乙個重要手段,但是可能會導致死鎖。
死鎖:一組互相競爭資源的執行緒因互相等待,導致永久阻塞的現象。
執行緒t1執行賬戶a轉賬戶b的操作;
執行緒t2執行賬戶b轉賬戶a的操作;
當t1和t2同時執行完①處的**時,t1獲得了賬戶a的鎖,t2獲得了賬戶b的鎖,之後t1和t2在執行②處的**時,t1試圖獲取賬戶b的鎖,發現賬戶b已經被鎖定了,所以t1開始等待,t2試圖獲取賬戶a的鎖,發現賬戶a已經被鎖定了,所以t2開始等待。t1、t2會無期限的等待下去,就產生了死鎖。
死鎖發生的條件:
當上述四個條件都發生時,才會產生死鎖。只要破解其中的乙個,就可以避免死鎖的發生。
「互斥」,沒有辦法破壞,因為鎖的行為就是互斥。
1.破壞占用且等待條件
設定乙個角色,同時申請資源和同時釋放資源,賬戶類裡面持有乙個角色單例(必須是單例,只能有乙個人來分配資源)
class allocator else
return true;
} // 歸還資源
synchronized void free(
object from, object to)
}class account }}
} finally
} }
2.破壞不可搶占條件
核心是能夠主動釋放它所占用的資源,synchronized申請資源的時候,如果申請不到,執行緒直接進入阻塞狀態了,釋放不了已經占用的資源。
3.破壞迴圈等待條件
需要對資源進行排序,按序申請資源
class account ⑥
// 鎖定序號小的賬戶
synchronized(left)}}
} }
死鎖與解決死鎖
要是以後寫資料庫的產品,不是寫sql語句,那裡面涉及到的鎖就跟多了。故事裡有五個哲學家 這些哲學家很窮,只買得起五根筷子。他們坐成一圈,兩個人的中間放一根筷子。哲學家吃飯的時候必須同時得到左手邊和右手邊的筷子。如果他身邊的任何一位正在使用筷子,那他只有等著。假設哲學家的編號是a b c d e,筷子...
死鎖及死鎖的解決
如果一組程序中的每乙個程序都在等待僅由該組程序中的其它程序才能引發的事件,那麼該組程序是死鎖的,1 競爭不可搶占性資源。當系統把某資源分配給該程序後,就不能將它強行收回,只能在程序用完後自行釋放。2 競爭可消耗資源。當系統中供多個程序共享的資源如印表機,公用佇列等,其數目不足以滿足諸程序的需要時,會...
解決oracle死鎖
查哪個過程被鎖 查v db object cache檢視 select from v db object cache where owner 過程的所屬使用者 and locks 0 2.查是哪乙個sid,通過sid可知道是哪個session.查v access檢視 select from v ac...