Java并发编程 - AQS 之 ReentrantReadWriteLock

简介: Java并发编程 - AQS 之 ReentrantReadWriteLock

介绍

ReentrantLock是互斥排他锁,同一时间只能有一个线程在执行任务,ReentrantLock支持锁的重入功能,虽然保证了线程的安全性,但是效率不高,实际上应该是写操作互斥,读操作共享。而jdk提供了读写锁ReentrantReadWriteLock。



公共代码(下面四种情况代码根据时间等候判断区别)


public class MyTask {
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    public void read() {
        try {
            lock.readLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }
    }
    public void write() {
        try {
            lock.writeLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.writeLock().unlock();
        }
    }
}

读读共享

public class ReadReadTest {
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.read(); // 读
            }
        });
        t1.setName("t1");
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.read(); // 读
            }
        });
        t2.setName("t2");
        t1.start(); 
        t2.start();
    }
}
// 输出
t2 start
t1 start
// 10s
t1 end
t2 end

写写互斥

public class ReadReadTest {
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.write(); // 写
            }
        });
        t1.setName("t1");
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.write(); // 写
            }
        });
        t2.setName("t2");
        t1.start(); 
        t2.start();
    }
}
// 输出
t1 start
// 10s
t1 end
t2 start
// 10s
t2 end

读写互斥

public class ReadReadTest {
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.read(); // 读
            }
        });
        t1.setName("t1");
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.write(); // 写
            }
        });
        t2.setName("t2");
        t1.start(); 
        t2.start();
    }
}
// 输出
t1 start
// 10s
t1 end
t2 start
// 10s
t2 end

写读互斥


public class ReadReadTest {
    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.write(); // 写
            }
        });
        t1.setName("t1");
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                myTask.read(); // 读
            }
        });
        t2.setName("t2");
        t1.start(); 
        t2.start();
    }
}
// 输出
t1 start
// 10s
t1 end
t2 start
// 10s
t2 end

总结

  • 记住一句话:读读共享;写写、读写、写读都互斥。
目录
相关文章
|
1天前
|
存储 安全 Java
Java并发编程中的高效数据结构:ConcurrentHashMap解析
【4月更文挑战第25天】在多线程环境下,高效的数据访问和管理是至关重要的。Java提供了多种并发集合来处理这种情境,其中ConcurrentHashMap是最广泛使用的一个。本文将深入分析ConcurrentHashMap的内部工作原理、性能特点以及它如何在保证线程安全的同时提供高并发性,最后将展示其在实际开发中的应用示例。
|
2天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
2天前
|
Java API 调度
[AIGC] 深入理解Java并发编程:从入门到进阶
[AIGC] 深入理解Java并发编程:从入门到进阶
|
2天前
|
前端开发 Java 测试技术
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
|
2天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
IDE Java 开发工具
Java从入门到精通:1.3.1实践编程巩固基础知识
Java从入门到精通:1.3.1实践编程巩固基础知识
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
6天前
|
IDE Java 物联网
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
13 0