Java并发中读写锁ReadWriteLock的简介说明

戚薇 Java经验 发布时间:2022-07-15 10:34:40 阅读数:15032 1
下文笔者讲述java读写锁ReadWriteLock的功能简介说明,如下所示

ReadWriteLock简介

读写锁:
  帮助解决多线程中读操作和写操作分离而设计的
  在系统中,读操作远远大于写操作,而每一次写操作进行时
  别的写操作也要等待
  这样对系统的性能会有很大的影响
  ReadWriteLock是JDK5开始提供的读写分离锁。

读写锁允许多个线程同时读,实现读的并行
  但为了保证数据的完整性,读操作和写操作是一定要互斥的 

获取读写锁

使用ReentrantReadWriteLock这个类中的
readLock()方法和writeLock()方法
分别拿到读锁和写锁
private static Lock lock = new ReentrantLock(); //普通的可重入锁
private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();//读写分离锁
private static Lock readLock = readWriteLock.readLock();
private static Lock writeLock = readWriteLock.writeLock();

为读操作和写操作加锁

public Object handleRead(Lock lock) throws InterruptedException {
    try {
          lock.lock();
          Thread.sleep(2000);
          System.out.println("ReadThread : "+Thread.currentThread().getId() + " | value = "+value);
          return value;
    } finally {
          lock.unlock();
    }
}

public void handleWrite(Lock lock,int value) throws InterruptedException {
    try {
        lock.lock();
        Thread.sleep(1000);
        System.out.println("WriteThread : "+Thread.currentThread().getId() + " | value = "+value);
        this.value = value;
    } finally {
        lock.unlock();
    }
}

测试代码

public static void main(String[] args) {
    final ReadWriteLockTest test = new ReadWriteLockTest();
    Runnable readRunnable = new Runnable(){
        public void run() {
            try{
                test.handleRead(readLock);
                //对比使用一般的锁
                //test.handleRead(lock);
            } catch (InterruptedException e) {

            }
        }
    };

    Runnable writeRunnable = new Runnable(){
        public void run() {
            try{
                test.handleWrite(writeLock,new Random().nextInt());
                //对比使用一般的锁
                //test.handleWrite(lock,new Random().nextInt());
            } catch (InterruptedException e) {

            }
        }
    };

    new Thread(writeRunnable).start();
    for(int i = 0 ; i > 10 ; i++) {
        new Thread(readRunnable).start();
    }
    new Thread(writeRunnable).start();

}
 
运行代码之后发现使用读写锁的时候
会有多个读操作并发执行
然后等待一秒执行写操作
而使用普通的可重入锁
则不管读操作还是写操作
都要等待一秒才能继续执行
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202207/16578525023979.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者