可重入读写锁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算法班详情链接如下:

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


相关文章
ReentrantReadWriteLock读写锁
ReentrantReadWriteLock读写锁
|
1月前
|
Java 开发者
深入解析ReentrantLock与StampedLock的使用技巧
选择 `ReentrantLock`还是 `StampedLock`,应基于具体的应用场景。如果你的应用中读操作远多于写操作,并且希望利用乐观读锁来提高并发性能,那么 `StampedLock`是一个不错的选择。反之,如果你需要更复杂的锁行为,如公平性控制、条件变量或是需要响应中断的锁操作,则 `ReentrantLock`可能更加合适。理解每种锁的特点,并合理应用,是提升Java并发程序性能的关键。
16 3
|
6月前
|
缓存 测试技术
ReentrantReadWriteLock 读写锁
ReentrantReadWriteLock 读写锁
42 0
|
2月前
|
安全 Java
JUC锁: ReentrantReadWriteLock详解
`ReentrantReadWriteLock` 主要用于实现高性能的并发读取,而在写操作相对较少的场景中表现尤为突出。它保证了数据的一致性和线程安全,在合适的场合合理使用 `ReentrantReadWriteLock`,可以实现更加细粒度的控制,并显著提升应用性能。然而,需要注意它的复杂度较一般的互斥锁高,因此在选择使用时要仔细考虑其适用场景。
32 1
|
5月前
|
监控 安全 Java
Java中的锁(Lock、重入锁、读写锁、队列同步器、Condition)
Java中的锁(Lock、重入锁、读写锁、队列同步器、Condition)
28 0
|
6月前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
安全 Java
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
95 0
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
|
安全 Java 调度
java常见锁Reentrantlock,synchronized,SpinLock,ReadWriteLock
公平锁―是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后中请的线程比先中请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象
161 0
|
缓存 Oracle 关系型数据库
可重入读写锁ReentrantReadWriteLock的使用详解
ReentrantReadWriteLock是一把可重入读写锁,这篇文章主要是从使用的角度帮你理解,希望对你有帮助。
203 0
可重入读写锁ReentrantReadWriteLock的使用详解
|
缓存
ReadWriteLock可重入读写锁读写锁
ReadWriteLock可重入读写锁读写锁
163 0