第四章:Lock的使用
在Java中,除了通過synchronized關鍵字進行同步處理意外,Java還提供了另外的方法進行同步,這就是Lock這個類;
Lock lock = new ReentrantLock();
lock.lock()方法獲得對象鎖,lock.unlock()方法釋放對象鎖。相對於synchronized關鍵字這個lockz比較直接,易於理解。
lock.lock()方法所取得的鎖是對象鎖,當一個線程取得鎖以後,其餘線程則無法訪問同樣的鎖所標記的代碼。
synchronized關鍵字和wait()和notify(),notifyAll()方法的結合可以實現等待/通知模式,ReentrantLock也可以實現同樣的功能,但需要藉助Condition對象。
notify()/notifyAll()方法進行通知時被通知的線程是由JVM隨機選擇的。但是使用ReentrantLock結合Condition類是可以實現選擇性通知的。
synchronized就相當於整個Lock對象中只有一個單一的Condition對象,所有的線程都註冊在它一個對象的身上。
如果想要實現選擇性喚起某些線程,就需要生多個Condition對象,當在多個線程的調用的時候,調用那個Condition的signal()方法,於此Condition相關的線程就會被喚醒。
公平鎖,非公平鎖:在生成lock= new ReentrantLock(isFair)的時候,isFair是true就是公平鎖,是false就是非公平鎖,公平的意思是先到先服務這就是所謂的公平,但這也是相對的程序運行時,不一定非是先來先服務,總體上是先來先服務。