繼續面試大綱系列文章。java
這是多線程的第二篇。面試
多線程就像武學中對的吸星大法,理解透了用好了能夠得道成仙,俯瞰芸芸衆生;而濫用則會遭其反噬。編程
在多線程編程中要渡的第二個「劫」,則是Lock。在不少時候,包括面試、包括實際項目應用,咱們都會拿來和synchronized對比一番。安全
咱們知道,多線程的核心思想是經過增長線程數量來併發的運行,來提升效率,也就是數量決勝論,而不是質量決勝(提升每一個線程的處理能力)。多線程編程中面臨的最大挑戰,是如何解決多個線程同時修改一個公用的變量所帶來的變量值不肯定性問題。順着這個思路分析,經常使用辦法,無非就是,要麼對變量動手,在一個線程修改時,變量值被鎖定。要麼是對修改的操做動手,在該段代碼執行時,對其加鎖,其餘線程不能夠在同一時刻進入該段代碼執行。多線程
同synchronized同樣,Lock,也是實現了後一種辦法。只不過,實現方式,有所不一樣。併發
public class Mutex implements Lock { // 靜態內部類,自定義同步器 private static class Sync extends AbstractQueuedSynchronizer{ // 該方法用於判斷當前鎖是否在獨佔模式下被佔用狀態 protected boolean isHeldExclusively(){ return getState() == 1; } // 獲取鎖!!! public boolean tryAcquire(int acquires){
//典型的CAS原子操做,若是初始狀態爲0,能夠得到鎖 if (compareAndSetState(0, 1)){ setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } //釋放鎖,將當前狀態設置爲0 protected boolean tryRelease(int releases){ if (getState() == 0){ throw new IllegalMonitorStateException(); } setExclusiveOwnerThread(null); setState(0); return true; } // 返回一個Condition,每一個condition都包含了一個condition隊列 ,這個後續再說 Condition newCondition(){ return new ConditionObject(); } }
4.擴展:Condition,多路通知機制 ui
歡迎掃描如下二維碼關注公衆號:小端有話說:spa