java多线程设计模式1:读写锁模式

Java并发设计模式:生产者-消费者模式、读写锁模式与线程池模式!| 多线程篇(九) 🏆本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

关于读写锁模式需要明白几个要素
1、写:当前没有写操作,以及没有读操作
2、读:当前没有写操作

package com.puqiuyu.thread.blog.pattern;

/**
 * 
 * 
 * @author sunday
 *
 */
public class WriteAndReadLock {
    // 正在写的线程
    private int writings;

    // 等待写的线程
    private int waitWrites;

    // 正在读的线程
    private int readings;
    //定义写优先
    private boolean writePre;

    public WriteAndReadLock() {
        this(true);
    }

    public WriteAndReadLock(boolean writePre) {
        this.writePre = writePre;
    }

    public synchronized void readLock() throws InterruptedException {
        //当有写锁加入等待时,读锁排在其后。
        while (writings > 0 || (writePre && waitWrites > 0)) {
            this.wait();
        }
        readings++;
    }

    public synchronized void unReadLock() {
        this.notifyAll();
        readings--;
    }

    public synchronized void writeLock() throws InterruptedException {
        try {
            //有写或者有读都堵塞
            while (writings > 0 || readings > 0) {
                waitWrites++;
                this.wait();
            }
            writings++;
        } finally {
            waitWrites--;
        }
    }

    public synchronized void unWriteLock() {
        writings--;
        this.notifyAll();
    }
}

简单分析下
1、写锁时需要判断是否有其他写锁占用,同时需要判断是否有读操作占用。如果有等待。
2、读锁时,需要判断是否有写锁占用。
为了保证写优先,单其他写锁加入后,之后读锁都等待。

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物 本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。 阅读详情

相关推荐

聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

在112G SerDes高速通道下的400G/800G高速以太网端口下,如何保障通信速率,验证SerDes的数据完整性和链路余量,自动协商(AN)和链路训练(LT)功能显得尤其重要,其在DAC、ACC、AEC铜缆连接或高速背板通信上,自动协商(AN)和链路训练(LT)的工作与否将决定高速链路传输质量的优劣。本文将系统的讨论介绍自动协商(AN)和链路训练(LT)的测试流程,其可以独立使用,也可以与teledynelecroy SierraNet M1288配合使用。

专注有线以太网性能测试--丹麦信雅纳网络(Xena Networks) 9407

java多线程设计模式之Producer-Consumer模式(一)

Producer是生产者的意思,指的是生成数据的线程,Consumer则是消费者的意思,指的是使用数据的线程,这里我们要实现的是如何安全的将数据从生产者交给消费者,看似简单但是当两者处于不同的线程时,处理速度差异便会产生问题。对于这个问题,我们可以在两者之间加入一个桥梁通道的角色,具体的设计如下: 情景创建,假如说有个蛋糕店,糕点师制作蛋糕,顾客吃蛋糕,糕点师制作完成后将蛋糕放在桌子上,

Cherish__it的博客 967

浅谈武术擂台格斗机器人大赛

武术擂台机器人赛是工科类专业的一个跨学科的竞赛项目,它涵盖了机械结构、硬件电路和计算机程序等技术领域。笔者在校期间有幸参加过四次这样的比赛,有成功也有失败,对此深有感悟。本文仅为个人观点,有说得不对的地方,望积极指出,希望能帮助到有需要的人。

weixin_43811044的博客 1万+

java.io几种读写文件的方式

一、Java把这些不同来源和目标的数据都统一抽象为数据流。   Java语言的输入输出功能是十分强大而灵活的。   在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。   这里介绍几种读写文件的方式 二、InputStream、OutputStream(字节流) ...

weixin_34237596的博客 172

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4868

BEVFormer与TensorRT的完美结合:如何实现4倍推理加速?

本文详细解析了如何通过TensorRT的量化技术和自定义插件实现BEVFormer模型的4倍推理加速,同时保持精度损失小于1%。文章从模型架构与部署挑战入手,深入探讨了计算图优化、自定义插件开发和量化校准策略,并提供了完整的部署流程和性能调优技巧,为自动驾驶领域的实时3D感知提供了高效解决方案。

bean的博客 221

java多线程设计模式之ReadWriteLock(读写锁)

在之前的模式中,为了确保线程安全,每次读写数据只允许一个线程操作数据类对象,但是多线程同时读数据也是安全的,所以为了提升性能,是不是可以有一种模式,允许同时多线程读,但是只能一条写线程在操作数据类对象呢?答案是肯定的。现在就来介绍下读写锁模式。        Java并发包中有读写锁类ReadWriteLock,他的功能是使得当多个线程读和多个线程写同一块数据的情况下,允许多线程同时读,但是有线

易水南风的专栏 718

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3677

Java 多线程设计模式之Producer-Consumer

Producer-Consumer 模式通过在数据的生产者和消费者之间引入一个通道(Channel, 暂时可以将其简单地理解为一个队列)对二者进行解耦(Decouping):生产者将其生产的数据放入通道,消费者从相应通道中取出数据进行消费,生产者和消费者各自运行在各自的线程中,从而使双方处理速率互补影响。7.4.1 通道积压当消费者的处理能力低于生产者的处理能力时,随着时间的推移,通道中存储的“产品

lilele12211104的专栏 481

18、知识表示与学习范式

本文探讨了智能系统中的核心组成部分——知识表示与学习范式。从基础知识到实际应用,详细解析了符号表示、框架表示、语义网络和本体表示等知识表示方法,并介绍了监督学习、无监督学习、半监督学习和强化学习等学习范式。此外,还深入分析了这些技术在自然语言处理、图像识别和推荐系统等领域的具体应用及操作步骤。最后,展望了未来可能的技术发展方向。

ttt77的博客 85

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

《Python星球日记》 第43天:机器学习概述与Scikit-learn入门

Code_流苏:在代码中寻诗意,在实践中觅真知 934

Java多线程相关知识【12】--设计模式--读写锁模式(读写模式)

文章目录Java多线程相关知识【11】--设计模式--读写锁模式(读写模式)1.问题的引入产生问题的代码2.解决方案解决的原理代码实现读写锁的实现3.进阶解决方案问题的引入解决的原理代码实现读写锁共享数据读线程写线程读写锁的缺陷缺陷的分析缺陷的解决解决的实现代码读写锁改进 Java多线程相关知识【11】–设计模式–读写锁模式(读写模式) 1.问题的引入 ​ 假设现在有一个景点,而这个景点也只...

努力的小白X 395

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3366

第17章 读写锁分离设计模式(Java高并发编程详解:多线程与系统设计)

读写锁的类图// 获取显示锁, 没有获得锁的线程将被堵塞// 释放获取的锁Lock接口定义了锁的基本操作, 加锁和解锁, 显式锁的操作强烈建议与try finally语句块一起使用,加锁和解锁说明如下。lock() :当前线程尝试获得锁的拥有权, 在此期间有可能进入阻塞。unlock() :释放锁, 其主要目的就是为了减少reader或者writer的数量。

风一样 813

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

读写锁分离设计模式

文章目录读写锁分离设计模式LockReadWriteLockReadWriteLockImplReadLockWriteLock读写锁的使用ShareData, 对读写锁的进行线程控制总结 读写锁分离设计模式 对资源的访问一般包括两种动作–读和写,多线程同一时刻对资源读操作,虽然有资源竞争,但是这种竞争不足以引起数据不一致,那么这个时候直接采用排他锁的方式, 就显得有些粗暴了。 如果对某个资源读的操作多于写的操作,那么多线程读时并不需要加锁,很明显对程序性能的提升有很大的帮助,于是想搞一个读写锁的简单实现.

batman 269

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

读写锁设计模式

文章目录前言一、什么是读写锁设计模式二、问题考虑三、读写锁设计四、需求分析1、共享资源2、写工作线程3、读工作线程4、客户端 前言 承接上一节讲单线程执行设计模式中例子的问题:读和写用的是同一个锁。当多个线程同时需要进行读操作的时候,只有一个线程能够读,其它线程被阻塞。导致读操作的串行化,这会使得程序的执行效率降低。为了解决这个问题,我们要将读操作并行化。于是就有了ReadWriteLock Design Pattern(读写锁设计模式)。 一、什么是读写锁设计模式 读写锁设计模式就是将读锁和写锁分离开来

madleep的博客 467

Java多线程设计模式

Java多线程设计模式 Introduction 1  Java语言的线程 开始执行Java程序后,至少会有一个线程开始操作,有操作的是被称为主线程的线程,主线程执行输入类的main()。当main()里的所有处理均结束后,则主线程也同时结束。 当应用程序的规模大到一定程度

730

Java设计模式五 - 并发设计模式

当谈到并发设计模式时,我们通常是指那些用于处理多线程应用程序中并发问题的设计模式。这些模式可以帮助我们更有效地管理线程间的协作、共享资源、避免竞态条件等。现在让我们逐个并发设计模式进行详解并提供相应的示例代码。

justmyfreedom的博客 622

Java 多线程设计模式

安全性:不损坏对象不安全是指,对象的状态处于非预期状态,比如账户余额变成了负值生存性:进行必要的处理生存性是指:程序能正常运行,可进行必要的处理,影响生存性的典型问题有出现死锁复用性:可再利用类复用性是指代码重用,若复用性好,可减少大量重复代码性能:能快速,大量进行处理性能有两个方面的考虑因素:吞吐量和响应性,客户端程序比较重视响应性,服务端程序更重视吞吐量,吞吐量是指单位时间内完成的任务,响应性是指提交任务后多长时间内能收到程序的反馈。

假装你是大灰狼的专栏 814

Java 多线程优化:锁优化与线程安全的设计模式

高效的多线程编程不仅能提升系统的性能,还能确保程序在复杂的并发环境中运行稳定。通过合理的锁优化、线程安全设计模式以及使用并发工具包,可以极大地提升并发编程的效率和可维护性。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 900

图解Java多线程设计模式

图解Java多线程设计模式

炫的博客 3255

Java多线程编程中的设计模式与挑战

设计良好的多线程模式能够有效地提升程序的性能和响应速度,同时也需要注意线程安全性和各种并发问题的处理。生产者-消费者模式用于解耦生产数据和消费数据的线程,通过一个阻塞队列作为缓冲区,使得生产者和消费者能够在不同的速度下工作,提高系统的并发能力。线程池模式通过预先创建一组线程,管理和复用这些线程来执行异步任务,有效地控制线程的数量和生命周期,避免不必要的线程创建和销毁开销。读写锁模式适用于读多写少的场景,通过分离读操作和写操作,提高并发读的效率,降低写操作的开销。

省赚客开发者博客 380

【Java多线程】8 Java 中的并发设计模式

通常,生产者会把数据放入一个共享队列中,而消费者则从这个队列中取出数据进行处理。在并发编程中,使用设计模式可以帮助我们更好地组织代码,提升可读性和可维护性。了解这些并发设计模式及其在 Java 中的实现,将使我们能够更高效地编写并发程序。在并发编程中,设计模式可以帮助我们更好地组织代码,提高可读性和可维护性。在并发环境中,如果有大量线程只读数据而很少写入,可以使用读写锁模式来提高性能。提供了异步编程的能力,允许我们在任务完成时执行某些操作,而不需要阻塞主线程。任务调度模式允许我们定期执行某些任务。

A1924的博客 750

java多线程设计模式

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实...

weixin_30343157的博客 96

多线程设计模式-读锁分离设计模式

/获取显示锁,没有获得锁的线程将阻塞//释放获取的锁Lock接口定义了锁的基本操作,加锁和解锁,显示锁的操作强烈建议与 try finally语句快仪器室哟哦那个,加锁和解锁说明如下。.lock():当前线程尝试获得锁的拥有权,在此期间有可能进入阻塞.unlock: 释放锁,其主要目的就是为了减少reader或者writer的数量ReadWriter接口定义的代码//创建reader锁//创建write锁//获取当前有多少线程正在执行写操作。

sgx223534的博客 837

Java 经典设计模式-- 05.并发型模式

前言 书接上文,终于来到了设计模式篇最硬核的并发设计模式介绍篇了,上一篇中对 Java 8 的行为模式中的常用设计模式做了介绍与分析,本篇将对 Java 8 的并发模式中的常用模式做介绍与分析,为了为整个 Java 8 设计模式篇章践行,本篇将对 Wiki 上几乎所有的并发模式做介绍与分析,由于并发模式并不属于典型的设计模式,所以它们的跨度和分散知识可能就很多。目录: 双重检查锁定 守卫 检测对...

wufeiova的博客 1366

图解多线程设计模式pdf_多线程设计模式

多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、GuardSusperionsion、不变、生产者-消费者 模式;jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池;锁(分为内部锁、重入锁、读写锁)、ThreadLocal、信号量等在并发控制中发挥着巨大的作用。多线程设计模式:1.Single Threaded E...

weixin_34305091的博客 296
上一篇: java多线程设计模式大纲
下一篇: java多线程学习2:线程的生命周期监听-Observer模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值