能用内置锁就用内置锁,不能用内置锁,才考虑用显示锁。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(); }