基于ReenTrantReadWriterLock的读写锁

ReenTrantReadWriterLock

ReenTrantReadWriterLock是基于ReadWriteLock的实现类;
于获取读写锁的。两个方法:写锁:readLock();读锁:writeLock();
对于ReeTrantReadWriterLock:

  • 读读共享
  • 读写互斥
  • 写写互斥。
    下面基于ReenTrantReadWriteLock简单验证一下
package com.demo.udpdemo.reentrantReadWriteLockDemo;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * ReeTrantReadWriterLock 是ReadWriteLock的实现类;用于获取读写锁的。两个方法:写锁:readLock();读锁:writeLock();
 * 对于ReeTrantReadWriterLock,读读共享。读写互斥,写写互斥。
 *
 * @author yugan
 */
public class ReeTrantReadWriterLockTest {

    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

    /**
     * 获取读锁
     */
   static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();

    /**
     * 获取写锁
     */
   static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();


    /**
     * 读操作
     */
    public static void read() {
        String threadName = Thread.currentThread().getName();
        try {
            readLock.lock();
            System.out.println("线程:" + threadName + "获取到read锁");
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("线程:"+threadName+"释放read锁");
            readLock.unlock();
        }

    }

   static void write(){
        String threadName = Thread.currentThread().getName();
        try {
            writeLock.lock();
            System.out.println("线程:" + threadName + "获取到write锁");
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("线程:" + threadName + "释放write锁");
            writeLock.unlock();
        }
    }


}

第一组:读读共享

    public static void main(String[] args) {
        new Thread(()->read()).start();
        new Thread(()->read()).start();
//        new Thread(()->write()).start();
//        new Thread(()->write()).start();
    }

从结果可以看到:线程0和线程1同时获取到read锁:
在这里插入图片描述
第二组:写写互斥

    public static void main(String[] args) {
//        new Thread(()->read()).start();
//        new Thread(()->read()).start();
        new Thread(()->write()).start();
        new Thread(()->write()).start();
    }

从结果看到:线程1先获取到write锁以后,线程0得等线程1释放锁以后才能获取到write锁:说明写写互斥
在这里插入图片描述
第三组:读写 互斥

    public static void main(String[] args) {
        new Thread(()->read()).start();
//        new Thread(()->read()).start();
        new Thread(()->write()).start();
//        new Thread(()->write()).start();
    }

从结果看到:线程0获取到read锁,线程1要想获取到write锁得先等线程0释放read锁以后才能获取到
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值