本文翻译自http://tutorials.jenkov.com/java-util-concurrent/readwritelock.html,人工翻译,仅供学习交流。
ReadWriteLock
readwritelock是一种高级的线程锁机制,它允许多个线程读取某个资源,但一次只能有一个线程写入它。
其思想是,多个线程可以同时从共享资源中读取,而不会导致并发性错误。并发错误首先发生在对共享资源的读写并发发生时,或者多个写入并发发生。
在本文中,我只介绍了Java内置的ReadWriteLock。如果您想了解更多关于ReadWriteLock实现背后的理论.。你可以在我的Java并发教程中读到Read - Write Locks。
ReadWriteLock锁定规则
允许线程在读取或写入保护资源时锁定ReadWriteLock的规则如下 :
- 读锁 如果没有线程锁定ReadWriteLock进行写操作,没有线程请求写锁(但尚未获得),因此,多个线程可以锁定用于读取的锁。
- 写锁 如果没有线程正在读或写,因此,每次只有一个线程可以锁定写锁。
ReadWriteLock实现类
ReadWriteLock是一个接口,使用ReadWriteLock需要用到实现类。java.util.concurrent.locks包包含以下ReadWriteLock实现:
- ReentrantReadWriteLock
ReadWriteLock代码示例
下面是一个简单的代码示例,演示了如何创建ReadWriteLock以及读写如何锁定:
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock();
// multiple readers can enter this section
// if not locked for writing, and not writers waiting
// to lock for writing.
readWriteLock.readLock().unlock();
readWriteLock.writeLock().lock();
// only one writer can enter this section,
// and only if no threads are currently reading.
readWriteLock.writeLock().unlock();
请注意ReadWriteLock实际上是如何在内部保存两个Lock实例的。一个保护读访问,一个保护写访问。