Java多线程探究-读写锁ReentrantReadWriteLock
来源:互联网 发布:淘宝能买到呼死你吗 编辑:程序博客网 时间:2024/05/19 15:41
读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者
读写锁的场景
如果很多线程从一个数据结构读取数据而很少从线程修改其中数据的话,读写锁是十分有用的。在这种情况下,允许对读的线程共享访问时合适的。当然写的线程依然必须是互斥访问的
ReentrantReadWriteLock是Java的一个读写锁类
ReentrantReadWriteLock.ReadLock readLock()
返回用于读取操作的锁
ReentrantReadWriteLock.WriteLock writeLock()
返回用于写入操作的锁
读锁:不排斥读锁,排斥写锁
写锁:排斥其他的写锁和读锁
class FileObj{ public String context ; public String getContext() { return context; } public void setContext(String context) { this.context = context; }}class ReadThread extends Thread{ private FileObj fileObj; private ReentrantReadWriteLock.ReadLock lock; public ReadThread(FileObj obj , ReentrantReadWriteLock.ReadLock lock){ this.lock = lock; this.fileObj = obj; } @Override public void run(){ while(true){ lock.lock(); try{ System.out.println(getName()+" 读取 "+ fileObj.getContext()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }finally { lock.unlock(); } } }}class WriteThread extends Thread{ Random random = new Random(); private FileObj fileObj; private ReentrantReadWriteLock.WriteLock lock; private String[] str = {"Hello Java","Year Spark","Ok Flume"}; public WriteThread(FileObj obj , ReentrantReadWriteLock.WriteLock lock){ this.lock = lock; this.fileObj = obj; } @Override public void run() { while (true) { lock.lock(); try { String tmp = str[random.nextInt(3)]; System.out.println(getName() + " 写 " + tmp); fileObj.setContext(tmp); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } finally { lock.unlock(); } } }}public class ReadAndWriteTest { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); FileObj obj = new FileObj(); obj.setContext("Hello...."); Thread r1 = new ReadThread(obj,lock.readLock()); Thread r2 = new ReadThread(obj,lock.readLock()); Thread r3 = new ReadThread(obj,lock.readLock()); WriteThread w1 = new WriteThread(obj,lock.writeLock()); WriteThread w2 = new WriteThread(obj,lock.writeLock()); WriteThread w3 = new WriteThread(obj,lock.writeLock()); executorService.execute(r1); executorService.execute(r2); executorService.execute(r3); executorService.execute(w1); /* executorService.execute(w1); executorService.execute(w3);*/ executorService.shutdown(); }}
输出结果
0 0
- Java多线程探究-读写锁ReentrantReadWriteLock
- java多线程:ReentrantReadWriteLock读写锁的使用
- Java多线程读写锁ReentrantReadWriteLock原理详解
- 多线程Demo-ReentrantReadWriteLock读写锁
- 多线程之读写锁ReentrantReadWriteLock
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- JAVA多线程-Lock的使用(四)-读写锁ReentrantReadWriteLock
- Java多线程编程4--ReentrantReadWriteLock的使用(读写锁)
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- Java多线程编程-(15)-读写锁ReentrantReadWriteLock深入分析
- Java多线程编程-(17)-读写锁ReentrantReadWriteLock深入分析
- java线程系列---读写锁ReentrantReadWriteLock
- 【Java并发】- ReentrantReadWriteLock,读写锁原理
- java多线程学习9-显示锁ReentrantReadWriteLock
- 多线程之使用读写锁ReentrantReadWriteLock实现缓存系统
- 多线程编程入门(13):读写锁的使用(ReentrantReadWriteLock)
- java 多线程 ReentrantReadWriteLock 使用
- Java多线程之ReentrantReadWriteLock
- Centos6.8中kdump的设置问题
- 在O(1)时间复杂度删除链表节点
- RabbitMQ中的Exchange Types
- 126篇殿堂级深度学习论文分类整理 从入门到应用(上)
- 3.Scala中的函数
- Java多线程探究-读写锁ReentrantReadWriteLock
- Python基础语法
- 点击按钮实现缩放动画
- Redis通用命令
- 宽度优先搜索
- 126篇殿堂级深度学习论文分类整理 从入门到应用(下)
- [LeetCode]121. Best Time to Buy and Sell Stock
- javascript中void();执行返回SyntaxError
- Java的String类方法介绍