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

2024-01-13 17:52

本文主要是介绍设计模式之多线程版本的if------Balking模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
设计模式之避免共享的设计模式 Thread-Specific Storage 模式
设计模式之多线程版本的if------Guarded Suspension模式


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 简介
  • 与Guarded Suspension对比
  • 应用场景
  • 如何实现Balking模式
  • 样例


简介

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

与Guarded Suspension对比

Balking模式和Guarded Suspension模式一样,存在守护条件,如果守护条件不满足,则中断处理;这与Guarded Suspension模式不同,Guarded Suspension模式在守护条件不满足的时候会一直等待至可以运行。

应用场景

  • sychronized轻量级锁膨胀逻辑
  1. 初始状态:某个线程尝试进入同步块时,如果该同步块没有被其他线程占用,并且此时不存在竞争,Java 虚拟机会将该同步块的对象头 Mark Word 的部分记录下来作为该线程的锁记录(Lock Record)。
  2. 竞争状态:当其他线程也尝试进入同步块,而此时存在竞争时,轻量级锁会膨胀为重量级锁。重量级锁的实现通常会涉及到操作系统底层的线程阻塞和唤醒机制,它会使得持有该锁的线程阻塞而不是自旋等待。
  3. 膨胀过程:膨胀的过程中,Java 虚拟机会将原来记录在对象头的锁记录替换为指向重量级锁的指针,这样当其他线程尝试获取该锁时就会转变为重量级锁的获取和释放逻辑。
  • DCL单例实现

DCL(Double-Checked Locking)是一种单例模式的实现方式,它通过双重检查(即在加锁前后都检查是否已经创建实例)来提高单例模式的性能。

  • 服务组件的初始化
  1. 配置加载:加载服务组件所需的配置信息,例如数据库连接信息、缓存配置、日志配置等。这可以通过读取配置文件、从外部服务获取配置等方式来实现。
  2. 资源分配和初始化:根据配置信息,初始化服务组件所需的资源,例如数据库连接池、线程池、缓存对象等。确保资源能够正确分配和初始化,并达到可用状态。
  3. 依赖注入:如果服务组件依赖于其他组件或对象,需要进行依赖注入,即将依赖的对象注入到服务组件中,以便服务组件能够正常运行。
  4. 启动服务:启动服务组件,使其处于可用状态,可以接受外部请求并提供相应的功能。
  5. 执行其他初始化逻辑:根据具体需求,执行其他必要的初始化逻辑,例如预加载数据、初始化定时任务等。

如何实现Balking模式

  • 锁机制 (synchronized reentrantLock)
  • cas
  • 对于共享变量不要求原子性的场景,可以使用volatile

样例

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @author yang* @version 1.0.0*/
public class BalkingExample {private boolean jobInProgress = false;private final Lock lock = new ReentrantLock();public void doJob() {if (lock.tryLock()) {try {if (jobInProgress) {System.out.println("工作已经在进行中,返回...");return; // 另一个线程已经在执行该操作,无需再执行}jobInProgress = true;System.out.println("执行...");// 执行需要做的工作} finally {jobInProgress = false; // 完成工作后将jobInProgress设置为falselock.unlock();}} else {System.out.println("另一个线程当前正在执行该作业, 返回...");}}public static void main(String[] args) {BalkingExample balkingExample = new BalkingExample();// 创建多个线程调用doJob方法for (int i = 0; i < 5; i++) {Thread thread = new Thread(() -> {balkingExample.doJob();});thread.start();}}
}

这篇关于设计模式之多线程版本的if------Balking模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602304

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代