并发编程设计模式——Balking模式(三十九)

Balking 模式

多线程下,维护一个共享状态满足某个条件时,执行业务逻辑;当不满足时则立即放弃。通常用互斥锁来确保共享状态线程安全,如果不需要保证共享状态原子性,也可以用 volitle 修饰,替换互斥锁。

Balking 模式的经典实现        

Balking 模式本质上是一种规范化地解决“多线程版本的 if”的方案,其实就是对if判断的加锁设计。并抽象一个方法出来。

 

这样的好处是将并发处理逻辑和业务逻辑分开。

用 volatile 实现 Balking 模式

使用 volatile 的前提是对原子性没有要求。

总结

  1. Balking 模式和 Guarded Suspension 模式从实现上看似乎没有多大的关系,Balking 模式只需要用互斥锁就能解决,而 Guarded Suspension 模式则要用到管程这种高级的并发原语;但是从应用的角度来看,它们解决的都是“线程安全的 if”语义,不同之处在于,Guarded Suspension 模式会等待 if 条件为真,而 Balking 模式不会等待。
  2. Balking 模式的经典实现是使用互斥锁,你可以使用 Java 语言内置 synchronized,也可以使用 SDK 提供 Lock;如果你对互斥锁的性能不满意,可以尝试采用 volatile 方案,不过使用 volatile 方案需要你更加谨慎。
  3. 当然你也可以尝试使用双重检查方案来优化性能,双重检查中的第一次检查,完全是出于对性能的考量:避免执行加锁操作,因为加锁操作很耗时。而加锁之后的二次检查,则是出于对安全性负责。双重检查方案在优化加锁性能方面经常会用到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11360.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

了解Synchronized与Lock的区别

前言: 在多线程编程中,保证线程安全是至关重要的。Java提供了两种主要的同步机制:synchronized关键字和Lock接口。尽管它们都是为了解决多线程并发访问共享资源的问题,但在使用方式和特性上存在一些显著的差异。 synchronized&am…

DOM操作和事件监听综合练习:利用JS实现图片轮播

我们经常会看到购物网页上有商品图片在自动循环播放,这就是图片轮播,图片轮播‌是一种常见的网页设计元素,用于在网页上自动切换显示多张图片或内容。它通过JavaScript来实现图片的自动轮播效果,结合HTML和CSS来完成布局和样式设置…

Spark 新作《循序渐进 Spark 大数据应用开发》简介

《循序渐进Spark大数据应用开发》由清华大学出版社出版,已于近期上市。该书基于Spark 3.5.1编写,提供24个实战案例26个上机练习,可谓是目前市面上最新的Spark力作。 本文对《循序渐进Spark大数据应用开发》一书做个大致的介绍。 封面部分 …

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计(MLE) 二、最大后验估计(MAP) 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时,MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频: 贝叶斯解释“L1和L2正则化”&#xff…

算法|牛客网华为机试41-52C++

牛客网华为机试 上篇:算法|牛客网华为机试21-30C 文章目录 HJ41 称砝码HJ42 学英语HJ43 迷宫问题HJ44 SudokuHJ45 名字的漂亮度HJ46 截取字符串HJ48 从单向链表中删除指定值的节点HJ50 四则运算HJ51 输出单向链表中倒数第k个结点HJ52 计算字符串的编辑距离 HJ41 称砝…

【国产桌面操作系统开发】制作桌面快捷方式

前言 目前使用最广的国产桌面操作系统是麒麟kylin操作系统和统信UOS操作系统,在国产系统上开发应用,需要在桌面提供一个快捷方式给用户使用,国产系统是Linux阵营,与window系统是有差异的。 国产系统桌面 国产系统桌面是一个xxx.d…

AndroidStudio-常用布局

一、线性布局LinearLayout 线性布局内部的各视图有两种排列方式: 1.orientation属性值为horizontal时,内部视图在水平方向从左往右排列。 2.orientation属性值为vertical时,内部视图在垂直方向从上往下排列。 如果不指定orientation属性,…

UEditor(百度开源的在线编辑器,修改版)

dc-UEditor,rich text 富文本编辑器,基于百度UEditor 1.4.3.3-utf8-php版修改。 修复了Uploader.class.php的安全隐患。 新增了以下功能: 1、上传图片是否加水印。 2、新增了单独调用上传的接口。 3、表情本地化,预防百度UEd…

Docker安装部署RabbitMQ

1. Docker环境准备 1.1 安装Docker 在开始Docker安装部署RabbitMQ之前,确保您的系统环境已经满足Docker的运行要求。以下是在不同操作系统上安装Docker的步骤和命令行演示。 对于Linux系统 在基于Debian的系统(如Ubuntu)上,您…

通义千问API调用测试 (colab-python,vue)

文章目录 代码(来自官网)colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面,点击API示例 前端调用直接在前端调用的优缺点以vue为例(代码是基于官网node.js的代码转换而来&#xf…

BLDC基础知识复习【一】

焊接DDR的时候用镊子轻轻抖动一下,能晃动后复位代表焊接成功;用棉签和洗板水清洗板子,不要用纸擦 无刷没有定子和换向器,转子和定子反过来了: KV值越大,电机转速越大。电机转速 KV * 供电电压 外转子电机…

鸿蒙UI开发——自定义UI绘制帧率

1、概 述 随着设备屏幕的不断演进,当前主流设备采用LTPO屏幕(可变刷新率屏幕),此类屏幕支持在多个档位之间切换屏幕帧率。 对于快速变化的内容,如射击游戏,交互动画等,显示帧率越高&#xff0…

递归写斐波那契数

在思考一些C语言编程题的解法时我们经常会碰到的一种算法是递归,递归的字面意思是传递回归,会用例子来解释和运用。 递归 例:在控制台输出指定项数的斐波那契数 斐波那契数列数列是指:1,1,2,3,5,8,13,21,34......从第三项开始等…

手写JDK动态代理实现AOP

AOP底层? AOP(Aspect Oriented Programming,面向切面编程)在 Java 中的实现有多种方式,其中使用 JDK 动态代理和 CGLIB 代理较为常见。 当你的应用程序遵循面向接口编程的原则时,JDK 动态代理是一个自然的…

Gin框架

GoWeb框架 GIN框架 基于httprouter开发的Web框架 安装与使用 安装 下载并安装GIN go get -u github.com/gin-gonic/gin 示例 package mainimport ("github.com/gin-gonic/gin" )func main() {// 创建一个默认的路由引擎r : gin.Default()// GET:请…

nodejs - nodejs安装步骤

安装 NodeJS 1.下载 NodeJS下载官网:https://nodejs.cn/download/ 2.验证 下载后解压安装,运行如下命令验证安装是否成功: node -v npm -v3.查看默认存放位置 查看npm默认存放位置,运行命令如下: npm get prefix…

Spring Boot框架:计算机课程管理的工程认证之光

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足,创建了一个计算机管理基于工程教育认…

游戏设计:推箱子【easyx图形界面/c语言】

在之前写程序设计的大作业时,在哔哩哔哩上跟着一个视频的学习的成果【第一个练习的】 今天整理文件的时候看到的,就发出来一下【CSDN和B站都有详细教程】 不是大项目,只有两个界面 这个代码只有两百行不到,但通过这个把基本的运…

C++数学

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 数论:质数、最大公约数、菲蜀定理 组合数学汇总 计算几何 博弈论 曼哈顿距离与切比雪夫距离 红线是哈曼顿距离,绿线是切比雪夫距离。 二维曼哈顿距离转切比雪夫距离 曼哈顿距离:|…

如何安装VMWare Workstation 16虚拟机

1、到VMware官网下载安装包。 2、下一步。 3、勾选同意协议,下一步。 4、更换安装路径,下一步。 5、取消全部勾选,下一步。 6、下一步。 7、安装。 8、等待安装完成。 9、安装完成,启动软件。 10、输入许可证ZF3R0…