标签:zed 升级 重试 引入 对象状态 灵活 情况 new 需要
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock.
ReentrantLock是可重入的锁,它不同于内置锁, 它在每次使用都需要显示的加锁和解锁, 而且提供了更高级的特性:公平锁, 定时锁, 有条件锁, 可轮询锁, 可中断锁. 可以有效避免死锁的活跃性问题.ReentrantLock实现了
Lock接口:
public interface Lock { //阻塞直到获得锁或者中断 void lock(); //阻塞直到获得锁或者中断抛异常 void lockInterruptibly() throws InterruptedException; //只有锁可用时才获得,否则直接返回 boolean tryLock(); //只有锁在指定时间内可用时才获得,否则直接返回,中断时抛异常 boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); //返回一个绑定在这个锁上的条件 Condition newCondition(); }
Lock使用
Lock lock = new ReentrantLock(); lock.lock(); try{ //更新对象状态 }finally{ //这里注意,一定要有finally代码块去解锁 //否则容易造成死锁等活跃性问题 lock.unlock(); }
可轮询和可定时的锁请求是通过tryLock()方法实现的,和无条件获取锁不一样. ReentrantLock可以有灵活的容错机制.死锁的很多情况是由于顺序锁引起的, 不同线程在试图获得锁的时候阻塞,并且不释放自己已经持有的锁, 最后造成死锁. tryLock()方法在试图获得锁的时候,如果该锁已经被其它线程持有,则按照设置方式立刻返回,而不是一直阻塞等下去,同时在返回后释放自己持有的锁.可以根据返回的结果进行重试或者取消,进而避免死锁的发生.
?ReentrantLock是一种标准的互斥锁,每次最多只有一个线程能持有锁。读写锁不一样,暴露了两个Lock对象,其中一个用于读操作,而另外一个用于写操作。
public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading. */ Lock readLock(); /** * Returns the lock used for writing. * * @return the lock used for writing. */ Lock writeLock(); }
public class ReadWriteMap<K, V> { private Map<K, V> map; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public ReadWriteMap(Map<K, V> map) { this.map = map; } public V get(K key) { readLock.lock(); try { return map.get(key); } finally { readLock.unlock(); } } public void put(K key, V value) { writeLock.lock(); try { map.put(key, value); } finally { writeLock.unlock(); } } }
标签:zed 升级 重试 引入 对象状态 灵活 情况 new 需要
原文地址:https://www.cnblogs.com/yuyuchen/p/9090824.html