在java多線程中,咱們可使用synchronized關鍵字來實現線程之間的同步互斥工做。還有一個更優秀的機制去完成這個「同步互斥」工做,就是Lock,主要學習兩種一個是重入鎖和讀寫鎖。他們比synchronized功能更強大,而且還具備嗅探鎖定、多路分支等功能。java
在使用synchronized時,多線程協同工做必須配合wait()和notify()、notifyAll()協同使用, 在使用Local的時候可使用一個新的等待/通知的類,他就是Condition,這個condition必定是針對某一把鎖的,也就是說只有鎖的基礎上才能產生condition condition的await()阻塞方法,和signal()方法。 一個Lock能建立多個condition進行多線程之間的交互,可使得部分線程喚醒signalAll(),部分線程等待, Lock lock = new ReentrantLock() 建立鎖的時候能夠指定公平鎖和非公平鎖,公平鎖就是按照代碼的順序進行加鎖,非公平鎖效率略高於公平鎖 Lock 用法 tryLcok嘗試得到鎖,返回true/false。好處是不用等待了,也能夠設置在指定的時間內得到嘗試得到鎖,一樣返回true/false isFair 是不是公平鎖 isLocked是否鎖定多線程
2.讀寫鎖 ReenTrantReadWriteLock,起核心就是實現讀寫分離的鎖,在高併發的尤爲是讀多寫少性能遠高於重入鎖. 其實是兩個鎖,一個是讀的鎖,一個是寫的鎖 口訣 : 讀讀共享 寫寫互斥 讀寫互斥併發