java多线程 -- ReadWriteLock 读写锁
2023-09-14 09:00:30 时间
写一条线程,读多条线程能够提升效率。
写写/读写 需要“互斥”;
读读 不需要互斥.
- ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。
- ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。 ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
api相关方法:
- Lock readLock()返回用于读取操作的锁。
- Lock writeLock()返回用于写入操作的锁。
demo:
package com.company; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要“互斥” * 读读 不需要互斥 * */ public class TestReadWriteLock { public static void main(String[] args) { ReadWriteLockDemo rw = new ReadWriteLockDemo(); new Thread(() -> rw.set(new ReadWriteLockDemo.Person("soyoungboy", 27)), "Write:").start(); for (int i = 0; i < 10; i++) { new Thread(() -> rw.get()).start(); } } } class ReadWriteLockDemo { private Person person; private ReadWriteLock lock = new ReentrantReadWriteLock(); //读 void get() { lock.readLock().lock(); //上锁 try { if (person != null) { System.out.println(Thread.currentThread().getName() + " ==> person : " + person.toString()); }else { System.out.println(Thread.currentThread().getName() + ""); } } finally { lock.readLock().unlock(); //释放锁 } } //写 void set(Person person) { lock.writeLock().lock(); try { System.out.println(Thread.currentThread().getName()); this.person = person; } finally { lock.writeLock().unlock(); } } static class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } }
结果:
Thread-0 Thread-1 Thread-3 Thread-2 Write: Thread-4 ==> person : Person{name='soyoungboy', age=27} Thread-6 ==> person : Person{name='soyoungboy', age=27} Thread-8 ==> person : Person{name='soyoungboy', age=27} Thread-5 ==> person : Person{name='soyoungboy', age=27} Thread-7 ==> person : Person{name='soyoungboy', age=27} Thread-9 ==> person : Person{name='soyoungboy', age=27}
相关文章
- JAVA多线程和并发基础面试问答
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
- Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期
- Java多线程--线程操作范例
- Java多线程--线程常用操作方法
- java基础多线程之共享数据
- Java多线程编程之单例模式
- java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取
- java多线程 -- Condition 控制线程通信
- java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列
- 【JAVA】 04-Java中的多线程
- JAVA编程思想读书笔记(五)--多线程
- java多线程体系
- java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取
- java多线程 -- 线程八锁
- java多线程 -- Condition 控制线程通信
- java多线程 -- 同步鎖
- java多线程 -- 创建线程的第三者方式 实现Callable接口
- java多线程 -- CountDownLatch 闭锁
- 【JAVA】 04-Java中的多线程
- [Linux] Install java and add JAVA_HOME, PATH
- Java多线程和并发基础面试问答
- Java Demo示例:多线程定时执行批量任务
- Java多线程学习笔记 - 五、Java中线程的生命周期
- Java多线程学习笔记 - 九、Java多线程中的死锁
- Java多线程--使用future进行异步编程
- java juc多线程编程代码示例:ForkJoinPool
- Java多线程--synchronized修饰普通方法和修饰静态方法的区别
- 【java】Java 包(package)
- Java多线程中常用的方法