-
(1) ReadWriteLock是一个接口
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(); }
其中readLock()提供了读锁, writeLock()提供了写锁
(2) Javadoc对ReadWriteLock含义的说明
* A {@code ReadWriteLock} maintains a pair of associated {@link * Lock locks}, one for read-only operations and one for writing. * * The {@linkplain #readLock read lock} may be held simultaneously * by multiple reader threads, so long as there are no writers. * * The {@linkplain #writeLock write lock} is exclusive.
(3) 对于多处理器上被频繁__读取__的数据结构, ReadWriteLock可以提高性能;
对于其他情况, ReadWriteLock不如普通的Lock, 因为实现更复杂
(4) 示例
public class ReadWriteMap <K,V> { private final 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 put(K key, V value) { writeLock.lock(); try { return map.put(key, value); } finally { writeLock.unlock(); } } public V remove(Object key) { writeLock.lock(); try { return map.remove(key); } finally { writeLock.unlock(); } } ... public V get(Object key) { readLock.lock(); try { return map.get(key); } finally { readLock.unlock(); } } public int size() { readLock.lock(); try { return map.size(); } finally { readLock.unlock(); } } ... }
(5) ReentrantReadWriteLock是ReadWriteLock的一种实现, 在它的构造函数中可以指定读写锁的策略(读/写优先?)
(6) 上面的示例中, 所有的读操作之前都获取readLock, 所有的写操作之前都获取writeLock
chapter13_显式锁_5_读写锁
最新推荐文章于 2024-08-09 09:51:50 发布