Java中的互斥锁和读写锁
在JDK5之前,访问共享对象的时候使用的机制只有synchronized和volatile ,JDK5的并发包里提供了一种新的更加高级的机制:互斥锁ReentrantLock,显式锁是为了弥补内置锁的方法而开发的,两者是互补的关系,显式锁并不能代替内置锁。ReentrantLock实现了一种标准的互斥锁,亦即每次最多有一个线程能够持有ReentrantLock Lock接口&ReentrantLock简介concurrent包中的Lock类定义了一组抽象的加锁操作,如下代码所示,与synchronized不同的是,Lock提供了一种无条件、可轮询、定时、可中断的锁获取操作,所有的加锁和解锁操作都是显示的ReentrantLock实现了Lock接口,提供了与synchronized相同的互斥性以及内存可见性。与synchronized一样,ReentrantLock提供了可重入(即可以被单个线程多次获取)的加锁语义。 123456789public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition();} ReentrantLock的使用方法: 12345678Lock lock = new ReentrantLock();...lock.lock();try{} finally{ lock.unlock();} 在使用显示锁的时候一定要在finally块中释放锁,否则如果代码中一旦出现异常,那么可能这个锁永远都无法释放就会造成某个对象的状态不一致,如果是账户余额或者别的重要的信息可能就会出现很严重的事故。