面试

显式锁

2017-01-12  本文已影响21人  evil_ice

在Java5.0之前,在协调对共享对象的访问时可以使用的机制有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock. ReentrantLock并不是一种替代内置加锁的方法,而是当内置锁机制不适合时,作为一种可选择的高级功能.

一,显示锁Lock和内置锁synchronized

Lock接口定义了一组抽象的加锁操作.与内置加锁机制不同的是,Lock提供了一种无条件的,可轮询的,定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的.

1, void lock() 
 获取锁。
2, void lockInterruptibly() 
 如果当前线程未被中断,则获取锁。
3, Condition    newCondition() 
 返回绑定到此 Lock 实例的新 Condition 实例。
如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false。
4, boolean  tryLock() 
仅在调用时锁为空闲状态才获取该锁。
5, boolean  tryLock(long time, TimeUnit unit) 
如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
6, void unlock() 
释放锁。

总之,虽然与内置锁相比,显示的lock更能提供一些扩展功能,有着更高的灵活性. 但ReentrantLock不能完全替代synchronzied,只有synchronized不能满足需求的时候,才应该用他.

二,读写锁ReadWriteLock
 Lock   readLock() 
          返回用于读取操作的锁。
 Lock   writeLock() 
          返回用于写入操作的锁。

一个简单的读写锁示例---使用读写锁包装一个Map,让其同步

public class ReadWriteMap<K,V>{
    private Map<K,V> map;
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private ReadLock readLock = lock.readLock();
    private WriteLock writeLock = lock.writeLock();
    
    public ReadWriteMap(Map<K,V> map){
        this.map = map;
    }
    
    public V put(K key, V value){
        try{
            writeLock.lock();
            return map.put(key, value);
        }finally{
            writeLock.unlock();
        }
    }
    
    public V get(K key){
        try{
            readLock.lock();
            return map.get(key);
        }finally{
            readLock.unlock();
        }
    }
}

参考:
<<java编发编程实战>>

上一篇 下一篇

猜你喜欢

热点阅读