volatile变量需要减少读取次数吗
问题说明
本人在前期读Netty源码时看到这样一段源码和注释:
private boolean invokeHandler() {// Store in local variable to reduce volatile reads.int handlerState = this.handlerState;return handlerState == ADD_COMPLETE || (!ordered && handlerState == ADD_PENDING);}
此源码见于io.netty.channel.AbstractChannelHandlerContext,其中的handlerState 是一个volatile修饰的状态量。在此方法中,需要两次使用handlerState变量。在我看来,这段代码中没有必要先使用局部变量handlerState 来保存volatile修饰的成员变量handlerState 。这样写似乎更简洁:
private boolean invokeHandler() {return handlerState == ADD_COMPLETE || (!ordered && handlerState == ADD_PENDING);}
Netty这段的注释给出了增加先使用局部变量handlerState 来保存volatile修饰的成员变量handlerState这行代码的理由:Store in local variable to reduce volatile reads。其意思为,存入本地变量来减少volatile类型属性的读取。
大概解释
鄙人多方查找资料,寻找这样做的原因,下面的这段解释似乎合理:
在编程中,减少对易变(volatile)变量的读取次数可以是一种优化技术,尤其是在并发编程中。这是因为频繁地从易变变量中读取数据可能会引入不必要的延迟,尤其是在高竞争的环境下。为了提高性能和减少延迟,你可以通过将易变变量的值存储在局部变量中来减少对它的直接访问。
为什么要减少易变变量(volatile)的读取?
性能优化:频繁读取易变变量可能会引入不必要的缓存失效和总线流量,特别是在多核处理器上。
避免竞态条件:虽然易变性本身是为了解决可见性问题,但过多的读取可能导致竞态条件的风险增加。
代码验证
为了严重在并发环境下频繁访问volatile变量时,直接读取和先读取存入局部变量两种方式性能差异,本人采用如下代码验证。
测试结果显示两种方式耗时差不多!对于这样的结果,是我的验证方式不准确,还是Netty源码中的先将volatile变量存入本地局部变量的做法是冗余代码,欢迎大家批评指正。
public class VolatileTest {static volatile int num = 5;static CountDownLatch latch = new CountDownLatch(20);public static void main(String[] args) throws InterruptedException {// 创建一个包含10个线程的固定线程池ExecutorService executor = Executors.newFixedThreadPool(10);//向线程池提交20个任务long start = System.currentTimeMillis();for (int i = 0; i < 20; i++) {executor.execute(() -> {for(int x = 0 ;x < 1000000 ; x++){//方式一:直接每次读取num来使用/** if(VolatileTest.num == 10){** }** if(VolatileTest.num > 5){** }** if(VolatileTest.num >7){** }* *///方式二:先读取num存入本地的局部变量int numLocal = VolatileTest.num;if(numLocal == 10){}if(numLocal > 5){}if(numLocal >7){}}latch.countDown();});}latch.await();long stop = System.currentTimeMillis();System.out.println(stop-start);// 关闭线程池executor.shutdown();}
}
相关文章:
volatile变量需要减少读取次数吗
问题说明 本人在前期读Netty源码时看到这样一段源码和注释: private boolean invokeHandler() {// Store in local variable to reduce volatile reads.int handlerState this.handlerState;return handlerState ADD_COMPLETE || (!ordered && handlerS…...
bootstrap.yml文件未自动加载问题解决方案
在添加bootstrap.yml文件后,程序未自动扫描到,即图标是这样的: 查了一些资料,是缺少bootstrap相关依赖,虽然已经添加了spring-cloud-context依赖,但是这个依赖并未引入bootstrap依赖,可能是版本问题,需要手动引入 <dependency><groupId>org.springframework.cloud&…...
编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider
系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI,都在用语法树(AST)-CSDN博客 编程AI深度实战:让verilog不再是 AI …...
前端知识速记--CSS篇:display
前端知识速记–CSS篇:display 一、什么是 display 属性? display 属性用于指定一个元素如何被显示在网页上。它不仅影响元素的显示形式,还对元素的布局、结构以及与其他元素之间的关系产生重要影响。 二、常用 display 属性值 1. block …...
51单片机 01 LED
一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC;如果没有找到hex文件(在objects文件夹下),在keil中options for target-output- 勾选 create hex file。 如果要修改编程 :重新编译-下载/编程-单片机重…...
WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果
WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…...
分页按钮功能
前言 在前端开发中,分页功能是一个常见的需求,特别是当需要展示大量数据时,它能有效提升用户体验。该文章结合运用了HTML,CSS,JS实现网页的分页按钮功能,并且可以选择每页显示的条数试试更新总页数及显示当…...
数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 2.2.3 结果汇总 …...
集合通讯概览
集合通信概览 (1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练:多维并行(xxx并行在上一期已经讲述…...
【FreeRTOS 教程 八】直达任务通知
目录 一、FreeRTOS 直达任务通知: (1)直达任务通知基本介绍: (2)更新目标通知的值: (3)性能优势和使用限制: 二、直达任务通知 API: &#…...
Ubuntu 18.04安装Emacs 26.2问题解决
个人博客地址:Ubuntu 18.04安装Emacs 26.2问题解决 | 一张假钞的真实世界 no X development libraries were found checking for X... no checking for X... true configure: error: You seem to be running X, but no X development libraries were found. You …...
nodejs:js-mdict 的下载、安装、测试、build
js-mdict 项目的目录结构:js-mdict 项目教程 js-mdict 下载地址: js-mdict-master.zip 先解压到 D:\Source\ js-mdict 6.0.2 用了 ts (TypeScript) 和 Jest,增加了应用开发的难度,因为先要了解 ts 和 Jest。 参阅:测试与开发&a…...
CSS关系选择器详解
CSS关系选择器详解 学习前提什么是关系选择器?后代选择器(Descendant Combinator)语法示例注意事项 子代选择器(Child Combinator)语法示例注意事项 邻接兄弟选择器(Adjacent Sibling Combinator࿰…...
Python在线编辑器
from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...
蓝桥杯备考:高精度算法之除法
我们除法的高精度其实也不完全是高精度,而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9,当它真正是1e9的时候,t是有可能超过1e9的,所以要用long long...
笔试-业务逻辑4
应用 小明在玩一个数字加减游戏,输入4个正整数:s、t、a、b,其中s>1,b<105,a!b。只使用加法或者减法,使得st。 每回合,小明用当前的数字,加上或减去一个数字;目前有…...
《Linux服务与安全管理》| 数据库服务器安装和配置
《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一: 安装PostgreSQL数据库,设置远程登录,客户端可以成功登录并操作数据库。 任务二: 安装MySQL数据库…...
麦芯 (MachCore) 应用开发教程 6:一台设备中多台电脑主从机的设置
麦芯是构建在windows系统上的设备应用操作系统,利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 在麦芯(MachCore)应用开发过程中,多机协同工作的场景十分常见…...
RAG 与历史信息相结合
初始化模型 # Step 4. 初始化模型, 该行初始化与 智谱 的 GLM - 4 模型进行连接,将其设置为处理和生成响应。 chat ChatZhipuAI(model"glm-4",temperature0.8, ) 此提示告诉模型接收聊天历史记录和用户的最新问题,然后重新表述问题&#x…...
99,[7] buuctf web [羊城杯2020]easyphp
进入靶场 <?php// 使用 scandir 函数扫描当前目录(即脚本所在目录)下的所有文件和文件夹// 该函数会返回一个包含目录下所有文件和文件夹名称的数组$files scandir(./); // 遍历扫描得到的文件和文件夹名称数组foreach($files as $file) {// 使用 …...
Ubuntu 24.04 + ROS2 Jazzy 开发环境避坑指南
️ 环境配置(仅需操作一次) 前提背景:Ubuntu 24.04 强制要求使用虚拟环境安装 pip 第三方库,而 ROS2 编译工具链(colcon, catkin_pkg)依赖系统全局 Python。为兼顾两者,需创建一个“能看见系统 …...
告别重复图片困扰:AntiDupl.NET 智能图片去重工具完全指南
告别重复图片困扰:AntiDupl.NET 智能图片去重工具完全指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因电脑中堆积如山的重复图片而感到困扰&…...
嵌入式调试进阶:JScope RTT模式移植与性能实测(对比HSS,速度提升千倍)
嵌入式调试革命:JScope RTT模式深度优化与高频数据采集实战 在电机控制、电源管理和高速信号处理等嵌入式应用场景中,开发人员经常需要实时监控关键变量的变化趋势。传统调试工具往往面临采样率低、数据延迟大等问题,而SEGGER JScope的RTT模式…...
Python 异步HTTP客户端实战:aiohttp深度解析
Python 异步HTTP客户端实战:aiohttp深度解析 引言 在现代Python后端开发中,异步HTTP客户端是构建高性能服务的关键组件。作为一名从Rust转向Python的后端开发者,我深刻体会到异步编程在处理大量并发请求时的优势。aiohttp作为Python生态中最流…...
强化学习如何优化城市洪水管理?哥本哈根项目揭示数据驱动规划新范式
1. 项目概述:当强化学习遇见城市洪水管理如果你是一位城市规划师或水务工程师,面对日益频发的极端降雨和城市内涝,传统的静态规划模型是否让你感到力不从心?气候变化带来的不确定性,让“一次性”的工程解决方案风险陡增…...
AI系统合规性故障模式解析:从公平性、隐私到可解释性的工程实践
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“AI-Compliance-Failure-Patterns”。光看名字,你大概能猜到它和AI的合规性有关,但具体是做什么的,可能还有点模糊。简单来说,这个项目就像一本针对AI系…...
如何在Windows上快速安装iPhone网络共享驱动:3分钟终极解决方案
如何在Windows上快速安装iPhone网络共享驱动:3分钟终极解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.c…...
基于MCP协议与向量检索,为AI编程助手构建跨会话持久记忆
1. 项目概述:为AI编程助手构建持久记忆如果你和我一样,日常重度依赖Cursor、Claude Code、Windsurf这类AI编程助手,那你一定遇到过这个让人头疼的场景:昨天在Cursor里花了半小时跟AI解释清楚了一个复杂模块的业务逻辑和设计思路&a…...
Deep Lake:面向AI的统一数据湖仓,重塑深度学习数据管理
1. 从数据湖到AI数据库:为什么我们需要Deep Lake?如果你在搞AI项目,尤其是涉及大语言模型(LLM)或者计算机视觉,数据管理这块儿大概率让你头疼过。我自己的经验是,项目初期,数据量小&…...
任务历史面板:浏览 Claude Code 的完整任务对话、复制提示词、一键切换继续工作
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
