能用內置鎖就用內置鎖,不能用內置鎖,才考慮用顯示鎖。segmentfault
接口主要方法以下:ide
接口主要方法以下:this
Lock lock = new ReentrantLock(); .... lock.lock();//獲取鎖 try{ //業務邏輯 }finally{ lock.unlock();//這邊要注意釋放,否則會致使鎖泄露 }
public class LockDemo { Lock lock = new ReentrantLock(); static int num = 0; public void addNum(int value) { lock.lock(); try { int temp = num; num = num + value; Thread.sleep(100); System.out.println(value + "+" + temp + "=" + num); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } static class AddThread1 extends Thread { LockDemo lockDemo; public AddThread1(LockDemo lockDemo) { this.lockDemo = lockDemo; } @Override public void run() { lockDemo.addNum(1); } } static class AddThread2 extends Thread { LockDemo lockDemo; public AddThread2(LockDemo lockDemo) { this.lockDemo = lockDemo; } @Override public void run() { lockDemo.addNum(2); } } public static void main(String[] args) { LockDemo lockDemo = new LockDemo(); AddThread1 addThread1 = new AddThread1(lockDemo); AddThread2 addThread2 = new AddThread2(lockDemo); addThread1.start(); addThread2.start(); } }
運行結果以下:
結果顯示,跟以前synchronized結果是同樣的,加鎖解鎖成功spa
構造參數有兩個,默認是非公平鎖,若是傳參是true,則是公平鎖。線程
public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }