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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑打开应用程序没反应怎么办 宇飞来手机锁了怎么办 宇飞来手机忘记密码怎么办 vivo手机突然开不了机怎么办 苹果六关不了机怎么办 微信老是无响应怎么办 打游戏被骂了怎么办 微信运动跳转排行榜失败怎么办 小恩爱账号忘了怎么办 华为账号更换后游戏账号怎么办 注册游戏账号需要身份证怎么办 英雄联盟被裁决了怎么办 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办