顯式鎖Lock和其實現類ReentrantLock的使用方式
阿新 • • 發佈:2018-12-18
java有兩種鎖,隱式鎖(synchronized)和顯式鎖(Lock),兩種鎖都能實現對共享資源的控制,但顯式鎖更加靈活。
本文主要介紹:Lock和其實現類ReentrantLock的使用方式
public interface Lock{ void lock(); // 獲取鎖 void lockInterruptibly(); // 優先考慮響應中斷,而不是獲取鎖;使用此方式獲的鎖,允許在等待時由 其他執行緒的通過Thread.interrupt()方法來中斷等待執行緒而直接返回 void tryLock(); // 如果鎖可用,則獲取鎖,並立即返回值 true,否則返回false void tryLock(long timeout,TimeUnit unit); // 在等待時間內如果鎖可用,則獲取鎖,成功返回 true,否則返回false void unlock(); // 釋放鎖 Condition newCondition(); // 得到繫結到此 Lock 例項的新 Condition 例項 }
Lock的使用方式
//預設為false,即非公平鎖,true為公平鎖 public static Lock lock=new ReentrantLock(false); 方式一: lock.lock(); //獲得鎖 try{ ... }finally(){ lock.unLock(); //釋放鎖 } 方式二: if(lock.tryLock()){ try{ ... }finally(){ lock.unLock(); //釋放鎖 } }else{ //獲取鎖失敗 } 方式三: lock.lockInterruptibly(); //獲得鎖,中斷有限 try{ ... }finally(){ lock.unLock(); //釋放鎖 }
condition是一個多執行緒間協調通訊的工具類,通過condition我們能控制多個執行緒的等待(await())和喚醒(signal())
public class Demo{ public static Lock lock=new ReentrantLock(); public static Condition full = lock.newCondition(); public static Condition empty = lock.newCondition(); public static List =new ArrayList(); public void full(){ whlie(true){ lock.lock(); //獲得鎖 try{ if(list.size>0){ System.out.println("full等待"); full.await(); }else{ list.add(1); System.out.println("empty喚醒"); empty.signal(); } }finally(){ lock.unLock(); //釋放鎖 } } } public void empty(){ while(true){ lock.lock(); //獲得鎖 try{ if(list.size<1){ System.out.println("empty等待"); empty.await(); }else{ list.remove(0); System.out.println("full喚醒"); full.signal(); } }finally(){ lock.unLock(); //釋放鎖 } } } public void main(String[] args) throws Exception{ final Demo demo=new Demo(); new Thread(new Runnable(){ public void run(){ demo.full(); } }).start(); new Thread(new Runnable(){ public void run(){ demo.empty(); } }).start(); } }