Java 1.5之后,新增了Lock接口来实现锁的功能,它提供了与synchronized类似的同步功能,只是在使用的时候需要手动的获取和释放锁,虽然缺少了synchronized隐式释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized不具备的同步特性。
Lock使用也很简单,以下是简单的使用方式。
public class Counter{
private Lock lock = new Lock();
private int count = 0;
public int inc(){
lock.lock();
/*
lock()方法会对Lock实例进行加锁,因此所有对象调用lock()方法的线程都会被阻塞
直到该Lock对象的unlock()方法被调用
*/
int newCount = ++count;
lock.unlock();
return newCount;
}
}
①lock():已阻塞的方式获取锁,也就是说,如果获取到了锁,立即返回;如果别的线程持有锁,当前线程等待,直到获取锁后返回
②tryLock():以非阻塞的方式获取锁,只是尝试性地去获取一下锁,如能获取锁,立即返回true,否则为false
③tryLock(long timeout,TimeUnit unit):如果获取了锁,则返回true,否则等待参数给定的时间单元,在等待的过程中,如果获取锁,则返回true,如果等待超时,则返回false
④lockInterruptibly():如果获取了锁,则返回;如果没有获取锁,当先线程处于休眠状态,直到获取锁,或者当前线程被其他的线程中断。
它与lock()方法最大的区别在于如果lock()方法获取不到锁,会一直处于阻塞状态,且会忽略interrupt()方法,示例如下: