JAVA多线程设计模式篇 5、Balking 模式——不需要就算了

Java多线程模式之Balking模式详解 主要介绍了Java多线程模式之Balking模式,结合实例形式较为详细的分析了Balking模式的原理、用法与相关注意事项,需要的朋友可以参考下 立即下载

在Balking模式中,如果守护条件不成立,就立即中断处理。

如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。

模拟文件保存,当文件在保存时,如果文件内容没有发生改变,直接return。如果内容以及发生改变,此时会真正的进行保存写入文件。客户端会持续写入文件,并定时保存;后台线程定时对文件进行保存。每隔一段时间自动保存数据的代码, 如果内容没有变化, 那么保存数据的线程可以直接return,无需等待数据的更改之后进行保存,然后再返回.

参与的类四个

  • Main 启动类

  • Data 数据的抽象类,提供了两个线程同步的方法,分别是修改文件内容和保存。

  • ChangerThread 定时修改文件内容的类

  • SaverThread 定时保存文件内容的类

1. Data类

Data.changed 状态表示文件是否被变更,如果没有变更,那么在保存的时候就直接返回了。

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Data {
    private final String fileName;
    private String content;
    private boolean changed;

    public Data(String fileName, String content){
        this.fileName = fileName;
        this.content = content;
        this.changed = true;
    }

    public synchronized void change(String newContent){
        content = newContent;
        changed = true;
    }

    public synchronized void save() throws IOException{
        if (!changed){
            return;
        }
        doSave();
        changed = false;
    }

    private void doSave() throws IOException{
        System.out.println(Thread.currentThread().getName() + "Calls doSave , content = " + content);
        Writer writer = new FileWriter(fileName);
        writer.write(content);
        writer.close();
    }
}   

2. SaverThread类

不断的定时保存信息。由于很多时候数据并没有发生变化,因此data.save()调用的时候并没有出发真正的写入。

import java.io.IOException;

public class SaverThread extends Thread{
    private final Data data;

    public SaverThread(String name, Data data){
        super(name);
        this.data = data;
    }

    @Override
    public void run() {
        try {
            while (true){
                data.save();
                Thread.sleep(1000);
            }
        }catch (IOException | InterruptedException e){
            e.printStackTrace();
        }
    }
}

3. ChangerThread类

定时写入数据,然后不定期的随机进行保存。 注意一方面后台线程会帮忙保存,一方面在ChangerThread写入后也会进行保存。

public class ChangerThread extends Thread{

    private final Data data;
    private final Random random = new Random();

    public ChangerThread(String name,Data data) {
        super(name);
        this.data = data;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; true; i++) {
                data.change("NO."+i);//修改数据
                Thread.sleep(random.nextInt(1000));//执行其他操作
                data.save();//显示的保存,用户自己点击保存
            }
        }catch (IOException e){
            e.printStackTrace();
        }catch (InterruptedException e){
            e.printStackTrace();
        }

    }
}

4.Main类

public class Main {
    public static void main(String[] args) {
        Data data = new Data("balkingTest", "this si first");
        new ChangerThread("changer-1", data).start();
        new SaverThread("saver-1", data).start();
    }
}

总结

在Balking模式中,如果守护条件不成立,就立即中断处理。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

15、导频辅助信道估计:挑战与解决方案 本文探讨了导频辅助信道估计在双选择性信道中的挑战,分析了传统方法的局限性,并提出了一种新的导频子载波结构。该结构综合考虑相干频率带宽与相干时间,通过动态移动导频位置并结合时间与频率分集,提升了高速移动环境下的信道估计性能。文章还讨论了其硬件实现、系统开销及兼容性等实际问题,并展望了优化策略、降低开销及与其他技术融合的未来研究方向。 阅读详情

相关推荐

八股文(Unity篇)

在Unity中,协程是通过迭代器实现的,即将协程函数的返回值类型定义为IEnumerator,然后使用yield语句暂停协程的执行,并在需要恢复执行时通过MoveNext()方法继续执行。Unity中的协程是一种能够在主函数中暂停和恢复执行的功能,它使用了C#的迭代器。Resources方式:Resources方式:使用Resources.Load方法加载Resources文件夹下的资源,这种方式的好处是简单易用,无需手动打包资源,但是会导致应用包变得较大,加载速度较慢,不适合较大的资源文件。

m0_50816320的博客 1万+

四、Balking (停止返回) 模式

Balking(停止返回) 模式中介绍: 如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回,这就是balking 模式。 在Java 中,我们使用if 来检查守护条件。balk 处理的执行则是使用return 从方法中退出,或者使用throw 抛出异常。守护条件的检查处理则是使用synchronized 放在临界区中。 balking 模式使用条件: 1)程序不需要再执行,可以使用balking 模式 2)不需要等待守护条件成立 3)守护条件仅在第一次成立时 B

donkeyboy001的博客 448

利用Arcgis发布wmts服务

使用发布 GIS 服务连接连接到 ArcGIS Server 站点后,可以将各种 GIS 资源(如地图文档、数据库以及服务定义)发布到服务器上。此外,还可以添加、删除、启动和停止服务。使用管理 GIS 服务器连接到 ArcGIS Server 站点后,可以编辑各种服务器属性,例如配置存储位置、集群配置、参与到该站点中的计算机列表以及管理站点的数据存储。通过使用 GIS 服务连接建立连接后,可以查看并使用发布到该站点的服务。但不能编辑服务器或服务属性、发布服务,也不能添加、删除、启动、停止或暂停服务。

ghgfsasxda的博客 2393

同步模式之Balking

Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。

shall_zhao的博客 483

Vue3多级路由缓存失效的深度解析与实战解决方案

本文深度解析了Vue3项目中多级路由下keep-alive缓存失效的根本原因,并提供了三种实战解决方案:通过路由扁平化根治问题、利用状态管理精细模拟缓存效果,以及借助keep-alive-vue3插件快速修复。文章旨在帮助开发者彻底理解Vue Router与keep-alive的协作机制,从而根据项目情况选择最佳策略,有效解决页面状态丢失的难题。

weixin_29015801的博客 285

(OpenCV)图像目标尺寸检测

  本文翻译自pyimagesearch技术博客上的一篇文章,《Measuring size of objects in an image with OpenCV》,原文作者:Adrian Rosebrock 。 https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv...

明柳梦少的博客 7万+

(六)Balking模式

一、定义 Balking是"退缩不前"的意思。Balking Pattern和Guarded Suspension Pattern一样需要警戒条件。在Balking Pattern中,当警戒条件不成立时,会马上中断,而Guarded Suspension Pattern则是等待到可以执行时再去执行。 二、模式案例 该案例会保存数据的属性,之前所保存的属性都会被覆盖。如果当前数据的属性与...

daziyuanazhen的博客 277

使用模拟工具Modbus poll 和PLC 通讯

使用模拟工具Modbus poll 和PLC 通讯 简介 Modbus Poll 是一个模拟Modbus 主站的工具。不用在现场调试,在家也能使用,方便快捷的调试验证程序。使用它可以和PLC进行Modbus TCP /RTU 通讯等功能,接下来为大家介绍使用Modbus Poll 和 PLC 进行 Modbus TCP 通讯。 组态PLC PLC作为我们的从站和Modbus Poll 通讯,那我们组态一个PLC。 创建通信DB 创建一个DB块,在数据类型处输入:TCON_IP_V4

weixin_61398412的博客 1万+

【设计模式】JAVA Design Patterns——Balking(止步模式)

洗衣机是一个具有两个状态的对象,可以处于两种状态:ENABLED和WASHING。禁止模式是一种软件设计模式,仅当对象处于特定状态时才对对象执行操作。例如,一个对象读取zip压缩文件并在压缩文件没打开的时候调用get方法,对象将在请求的时候”止步“。当洗衣机处于非活动状态时,按钮将按预期工作,但是如果已经在洗涤,则按钮将不起任何作用。止步模式用于防止对象在不完整或不合适的状态下执行某些代码。使用止步模式,仅当对象处于特定状态时才执行特定代码。,则它将不执行该操作,而是不执行任何操作而返回。

CSBIGDOG的博客 740

论文理解【LLM-Agent】——【SkillOpt】Executive Strategy for Self-Evolving Agent Skills

SkillOpt 将 agent skill 从人工或一次性 prompt artifact 转化为可验证、可控、可迁移的文本空间“可训练状态”,通过有界编辑、验证门控、拒绝编辑反馈和 slow/meta update,在不更新模型权重的情况下显著提升多类 agent 任务表现

佚失的诗篇 589

大模型选型实战指南|教育行业:108个模型「闭卷考试」实测,这3类应用场景直接抄作业!

教育行业大模型选型必读 1.闭卷考试!独家评测集:用最新K12真题(小学-高中全学科)构建“闭卷考场”,108个模型同台竞技,数据污染率<5%(传统评测集污染率超60%) 2.价格透明对比:40元/M tokens的阿里系模型VS 2元/M tokens的字节系、腾讯系模型,谁更值? 3.四大选型禁区:>60元但得分<75的模型被列入不推荐名单(附避坑清单) 4.核心结论直出:教学核心环节必须用专用模型,90%场景用通用模型可降本50%+

easyllm的博客 1523

多线程编程模式之Balking模式

Balking 文章目录BalkingBalking模式介绍Balking模式的使用场景Balking示例代码分析对Balking模式的理解 Balking模式介绍 如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回; Balking模式的使用场景 线程并不需要执行;由于某种操作已经被其他同类线程执行,而该线程没有必要重复执行操作时,可以使用Balking模式; 不需要等待...

博采众长,自成一派; 495

从光耦隔离到稳定驱动:信捷伺服与STM32的硬件设计陷阱与救赎

本文深入探讨了信捷伺服驱动器与STM32微控制器配合时的硬件设计关键问题,包括光耦隔离电路选型、电源电压选择、拨码开关设置等核心环节。针对伺服驱动器的稳定驱动需求,提供了从电路设计到抗干扰策略的完整解决方案,帮助工程师规避常见陷阱,提升工业控制系统的可靠性。

gold8的专栏 312

设计模式之多线程版本的if------Balking模式

Balking是“退缩不前”的意思。如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。当流程的执行顺序依赖于某个共享变量的场景,可以归纳为多线程if模式。Balking模式常用于一个线程发现另一个线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。Balking模式是一种多个线程执行同一操作时可以考虑的模式;在线程2被阻塞或者执行其他操作时,线程1同样可以完成操作,而当线程2执行或者继续执行。

小阳同学的博客 1484

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

读《图解java多线程设计模式》总结--Balking

1,从名字上看,balk是拒绝的意思,目的是确保在多线程条件下各线程能正常操作共享资源,该模式有点类似Guarded Suspension模式,唯一不同的是,Guarded Suspension当不满足守护条件的情况下会触发线程等待,而Balking当不满足守护条件时直接返回,不会触发线程等待。 2,适用范围,Balking模式的特点就是不进行等待,当守护条件不成立的时候,要立即进行其他操作,就...

kanganrui的专栏 233

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Day851.Balking模式 -Java 并发编程实战

Balking 模式和 Guarded Suspension 模式从实现上看似乎没有多大的关系,Balking 模式只需要用互斥锁就能解决,而 Guarded Suspension 模式则要用到管程这种高级的并发原语;但是从应用的角度来看,它们解决的都是“线程安全的 if”语义,不同之处在于,Guarded Suspension 模式会等待 if 条件为真,而 Balking 模式不会等待。

阿昌爱Java 1023

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

同步模式之犹豫模式Balking

同步模式之犹豫模式Balking是一种多线程编程中的同步模式。在该模式中,如果线程发现在执行操作之前会导致某些不良后果,则该线程会放弃执行该操作。这种模式通常用于避免竞态条件和死锁问题。

激流丶的博客 2366

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

精选12种与多线程和并发处理相关的设计模式264张图表 + 300段Java示例程序 = 轻松学习多线程编程1.图文并茂 通俗易懂日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与多线程和并发处理相关的12种设计模式。每章附带练习题和答案,自学者也可轻松学习2.专业实用 拓展进阶编写了30...

weixin_39790686的博客 757

图解多线程设计模式pdf_图解Java多线程设计模式 PDF 全书扫描版

序章1 Java线程 1I1.1 Java线程 2I1.2 何谓线程 2明为跟踪处理流程,实为跟踪线程 2单线程程序 3多线程程序 4Thread类的run方法和start方法 5I1.3 线程的启动 9线程的启动(1)——利用Thread类的子类 9线程的启动(2)——利用Runnable接口 10I1.4 线程的暂停 12I1.5 线程的互斥处理 13synchronized方法 14sync...

weixin_30839665的博客 1426

[Java并发-21-并发设计模式] Balking模式:线程安全的单例模式

上一篇文章中,我们提到可以用“多线程版本的 if”来理解 Guarded Suspension 模式,不同于单线程中的 if,这个“多线程版本的 if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。 需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘...

df007df的博客 172

设计模式之犹豫模式----Balking

上篇博客中用volatitle实现的两阶段之终止模式,若在测试方法中执行两次monitorThread.start()方法,就会导致监控线程成对执行。有时候我们我们需要的某个线程已经被执行之后还有线程执行它就不再执行。 如何保证某个方法只被执行一次,下次其他线程再执行就直接返回,不要执行了。 在之前的方法中再添加一个是否已经被执行过了的标记,一开始是flase,表示还没有被执行,当它被执行后,将该标记设置为true: private boolean stop=false; if(starting){

weixin_44173793的博客 506

并发编程模式 - Balking模式

多线程情况下,定时判断文本、编辑器【如优快云、Processon等】是否修改过,如果有修改过则进行保存,类似这样的场景称为Balking模式。特点: 1、可以将表示修改的方法用synchronized或者Lock修饰 2、使用volatile修饰,没有原则性要求。比如 Dubbo负载均衡会将服务的列表同步到本地,定时查询是否发送了变化 3、还有一种无所的方式,volatile + 双重锁(Double Check)检查机制的单利实现 传统的Balking模式写法如下: publi...

it_lihongmin的博客 337

谁能想到Java多线程设计模式竟然能被图解,大佬就是大佬,太牛了

有需要获取完整版资料的伙伴,点击文末下方传送门,即可获得免费领取方式!!

知识分享官 688

多线程十二种设计模式详解

文章目录前言多线程程序的评价标准Single Threaded Execution 模式Single Threaded Execution 模式简介Single Threaded Execution 模式中的登场角色在什么情况下使用 Single Threaded Execution 呢 ?生存性与死锁可复用性和继承反常临界区的大小和性能Immutable Object(不可变对象) 模式Immutable Object模式简介示例代码Immutable 模式中的登场角色在什么场景下使用Immutable模

qq_42605751的博客 2786

多线程模式-Balking模式

学习笔记

zjyfree的博客 338
上一篇: JAVA多线程设计模式篇 4、Guarded Suspension 模式——等我准备好了再来
下一篇: JAVA多线程设计模式篇 6、Producer-Consumer 模式——你生产我消费
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值