java 多线程 读写互斥锁ReentrantReadWriteLock:读读不互斥,读写互斥,写写互斥

ReentrantReadWriteLock:

类ReentrantLock具有相互互斥的排他效果,也就是说,同一时间,只有一个线程执行lock()方法后面的任务。这样做虽然可以解决问题,但是效率非常低。使用ReentrantReadWriterLock可以加快运行效率,某些不需要操作实例变量的方法中,完全可以使用它来提升代码运行效率。
为什么不需要操作实例变量变量方法才可以用它来提升效率呢?
  • (1),读读不互斥
  • (2),读写互斥
  • (3),写读互斥
  • (4),写写互斥

读读不互斥:

复制代码
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @ClassName ReentrantReadWriteLockRRExample
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/25.
 */
public class ReentrantReadWriteLockRRExample {
    public static void main(String[] args) {
        ReentrantReadWriteLock  rWlock = new ReentrantReadWriteLock();
        Runnable r = () ->{
            rWlock.readLock().lock();
            try {
                System.out.println("当前时间戳:" + System.currentTimeMillis());
                Thread.sleep(1000);
                System.out.println("当前时间戳:" + System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                rWlock.readLock().unlock();
            }
        };
        Thread t1 = new Thread(r,"t1");
        Thread t2 = new Thread(r,"t2");
        t1.start();
        t2.start();
    }
}
复制代码

 

 读写互斥:

复制代码
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @ClassName ReentrantReadWriteLockRW
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/25.
 */
public class ReentrantReadWriteLockRW {
    public static void main(String[] args) {
        ReentrantReadWriteLock rWLock = new ReentrantReadWriteLock(true);
        Runnable rr = () -> {
            String tName = Thread.currentThread().getName();
            rWLock.readLock().lock();
            System.out.println(tName + "开始读...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println(tName + "读完了!");
                rWLock.readLock().unlock();
            }
        };
        Runnable rw = () -> {
            String tName = Thread.currentThread().getName();
            rWLock.writeLock().lock();
            System.out.println(tName + "开始写...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println(tName + "写完了!");
                rWLock.writeLock().unlock();
            }
        };
        Thread reader = new Thread(rr,"读者1");
        Thread reader1 = new Thread(rr,"读者2");
        Thread writer = new Thread(rw,"作家1");
        Thread writer1 = new Thread(rw,"作家2");
        reader.start();
        reader1.start();
        writer.start();
        writer1.start();
    }
}
复制代码

 

 

 

posted on   zhangmingda  阅读(528)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-04-25 js中let和var定义变量的区别
2020-04-25 javascript中的12种循环遍历方法
2020-04-25 JavaScript 定时器
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示