可重入读写锁ReentrantReadWriteLock的demo使用

简介: 可重入读写锁ReentrantReadWriteLock的demo使用

公众号merlinsea


特性:写写互斥,读写互斥,读读共享

锁降级:写线程在获取写锁以后,完成写操作以后可以获取读锁同时释放写锁,即实现了锁降级。


/**
 * ReentrantReadWriteLockDemo
 */
public class ReentrantReadWriteLockDemo {
    private int i = 0;
    private int j = 0;
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    Lock readLock = lock.readLock(); // 获取读锁
    Lock writeLock = lock.writeLock(); // 获取写锁
    // 由于out是执行输出操作,不涉及修改操作,因此允许多个线程同时执行out,
    // 故使用读锁进行lock
    public void out(){
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"i的值====》"+i + "j的值====》"+j);
        }finally {
            readLock.unlock();
        }
    }
    // 由于inCreate是写数据操作,因此应该互斥访问,使用写锁进行lock
    public void inCreate() {
        writeLock.lock();
        try {
            i++;
            Thread.sleep(500L);
            j++;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            writeLock.unlock();
        }
    }
    public static void main(String[] args) {
        ReentrantReadWriteLockDemo reentrantReadWriteLockDemo = new ReentrantReadWriteLockDemo();
        // 
        for (int i = 0; i < 3; i++) {
            new Thread(()->{
                reentrantReadWriteLockDemo.inCreate();
                reentrantReadWriteLockDemo.out();
            }).start();
        }
        new Thread(()->{
            reentrantReadWriteLockDemo.out();
        },"读线程").start();
        new Thread(()->{
            reentrantReadWriteLockDemo.inCreate();
        },"写线程").start();
        new Thread(()->{
            reentrantReadWriteLockDemo.out();
        },"读线程1").start();
        new Thread(()->{
            reentrantReadWriteLockDemo.out();
        },"读线程2").start();
    }
}


vip算法班永久学习班: 800元/人

周一、周三、周五:8:30-9:30,周六、周日:10:30-11:30

报名方式:通过公众号导航栏的刷题群即可联系到我的微信号

vip算法班详情链接如下:

奔跑的小梁,公众号:梁霖编程工具库算法训练营快来参加吧~


相关文章
|
2月前
|
安全 Java
JUC锁: ReentrantReadWriteLock详解
`ReentrantReadWriteLock` 主要用于实现高性能的并发读取,而在写操作相对较少的场景中表现尤为突出。它保证了数据的一致性和线程安全,在合适的场合合理使用 `ReentrantReadWriteLock`,可以实现更加细粒度的控制,并显著提升应用性能。然而,需要注意它的复杂度较一般的互斥锁高,因此在选择使用时要仔细考虑其适用场景。
38 1
|
6月前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
6月前
|
监控
多线程并发之读写锁(ReentranReadWriteLock&ReadWriteLock)使用详解
多线程并发之读写锁(ReentranReadWriteLock&ReadWriteLock)使用详解
87 0
|
算法
ReentrantLock 是如何实现可重入性的?
ReentrantLock 是如何实现可重入性的?
59 0
|
安全 Java
synchronized 锁与 ReentrantLock 锁的区别
synchronized 锁与 ReentrantLock 锁的区别
111 0
|
安全 Java
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
95 0
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
|
Java
JUC基础(三)—— Lock锁 及 AQS(2)
JUC基础(三)—— Lock锁 及 AQS
94 0
|
算法 调度
JUC基础(三)—— Lock锁 及 AQS(1)
JUC基础(三)—— Lock锁 及 AQS
129 0
ReentrantLock是如何实现可重入性
ReentrantLock是如何实现可重入性
70 0
|
安全 Java 调度
java常见锁Reentrantlock,synchronized,SpinLock,ReadWriteLock
公平锁―是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后中请的线程比先中请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象
164 0