Java中的ReentrantReadWriteLock使用详解
作者:兴趣使然的程序猿
这篇文章主要介绍了Java中的ReentrantReadWriteLock使用详解,ReentrantReadWriteLock是Java中的一个锁实现,它提供了读写分离的功能,这种读写分离的机制可以提高并发性能,特别适用于读多写少的场景,需要的朋友可以参考下
ReentrantReadWriteLock
ReadWriteLock即读写锁,ReadWriteLock的规则如下。
a.当有线程获取了Write锁时,其他线程不能获取到任何锁(写锁和读锁都不能。
b.当没有线程获取Wrete锁时,所有线程都可以获取Read锁。
c.当有Read锁存在时,获取不到Write锁。
1 ReentrantReadWriteLock实现类继承关系
可见该类实现了ReadWriteLock接口。
2 ReentrantReadWriteLock使用
创建一个读写锁。
static ReadWriteLock lock = new ReentrantReadWriteLock();
获取写锁。
lock.writeLock().lock();
释放写锁。
lock.writeLock().unlock();
获取读锁。
lock.readLock().lock();
释放读锁。
lock.readLock().unlock();
3 ReentrantReadWriteLock使用实例
该实例测试的是上边的规则c——当有Read锁存在时,获取不到Write锁。
让一个线程先获取到读锁并持有5秒钟。
这是其他线程尝试去获取写锁,发现5秒之后其他线程再开始写入然后在控制台打印出结果。
class ReadWriteLockDemo{ static ReadWriteLock lock = new ReentrantReadWriteLock(); static String text = "hello"; public static void modify(){ lock.writeLock().lock(); try { System.err.println(Thread.currentThread().getName()+"开始修改"); text += " "+Thread.currentThread().getName(); }catch (Exception e){ e.printStackTrace(); } finally { lock.writeLock().unlock(); } } public static void readWithReadLock(){ lock.readLock().lock(); try { System.err.println(text); Thread.sleep(5000); System.err.println("5秒过去了"); }catch (Exception e){ }finally { lock.readLock().unlock(); } } public static void main(String[] args) throws InterruptedException { new Thread(()->{ readWithReadLock(); }).start(); Thread.sleep(1000); for (int i=0;i<10;i++) { new Thread(() -> { modify(); }).start(); } } }
使用读写锁时需要需要明确上述三条规则。
并且可知,当读很多时,很难写入,所以读写锁不适用于读和写都很多的情况。
到此这篇关于Java中的ReentrantReadWriteLock使用详解的文章就介绍到这了,更多相关ReentrantReadWriteLock使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!