当前位置: 首页 > news >正文

并发编程-volatile

        线程安全的核心保障机制基于三个关键特性:‌原子性(Atomicity)‌、‌可见性(Visibility)‌和‌有序性(Ordering)‌。这三个特性共同确保多线程环境下共享资源的正确访问与修改,避免竞态条件、数据竞争等问题。

        原子性(Atomicity):原子性指操作的最小单位不可分割,执行过程中不会被其他线程打断。实现原子性的方式有:1、synchronized关键字‌:通过锁机制保证方法或代码块在执行时独占资源;2、Atomic类,提供原子操作封装(如AtomicInteger)。

        可见性(Visibility):可见性确保一个线程对共享变量的修改能被其他线程立即反映出来。实现方式:1、volatile关键字‌:禁止指令重排序,确保每次访问主存最新值 2、‌synchronized锁‌:通过内部同步机制保证变量修改对其他线程可见 

        ‌有序性(Ordering):有序性指线程执行指令的顺序与代码编写顺序一致。

        线程安全的三大特性通过原子操作保障数据完整性、通过内存可见性避免数据不一致、通过有序性维护逻辑正确性。

        下方示例演示volatile的可见性作用,没用volatile修饰之前的代码如下:

package com.gingko.thread;
public class VolatileDemo {private static boolean flag = false;private static int count = 100;public static void main(String[] args) {//开启一个线程,持续运行直到flag = truenew Thread(() -> {while (true) {if(flag) {System.out.println("count = " + count);break;}}}).start();try {Thread.sleep(100);//主线程改变flag和count值flag = true;count = 80;} catch (InterruptedException e) {e.printStackTrace();}}
}

        程序运行后,由于子线程读取不到主线程修改的flag值,导致程序一直空转不停,效果如下:

        添加了volatile 修饰flag标识后,主线程修改flag变量后,子线程可以获取到最新的值,程序输出count值(主线程修改后的值80)后,程序break推出。

        程序运行结果如下,符合预期。

 

 


文章转载自:
http://alkaloid.zzyjnl.cn
http://brink.zzyjnl.cn
http://balzac.zzyjnl.cn
http://astatic.zzyjnl.cn
http://chippie.zzyjnl.cn
http://beige.zzyjnl.cn
http://absolve.zzyjnl.cn
http://cassette.zzyjnl.cn
http://alabastrine.zzyjnl.cn
http://ave.zzyjnl.cn
http://anoxia.zzyjnl.cn
http://bayern.zzyjnl.cn
http://angler.zzyjnl.cn
http://allegretto.zzyjnl.cn
http://brachyurous.zzyjnl.cn
http://automania.zzyjnl.cn
http://beloid.zzyjnl.cn
http://barmecidal.zzyjnl.cn
http://cantate.zzyjnl.cn
http://aiguille.zzyjnl.cn
http://carcinoma.zzyjnl.cn
http://biped.zzyjnl.cn
http://apomictic.zzyjnl.cn
http://antenuptial.zzyjnl.cn
http://barkentine.zzyjnl.cn
http://arrogant.zzyjnl.cn
http://bailment.zzyjnl.cn
http://broederbond.zzyjnl.cn
http://calices.zzyjnl.cn
http://brasflia.zzyjnl.cn
http://www.dtcms.com/a/281581.html

相关文章:

  • Python学习之路(十二)-开发和优化处理大数据量接口
  • git基础命令
  • Redis学习系列之——Redis Stack 拓展功能
  • 为什么市场上电池供电的LoRa DTU比较少?
  • redisson tryLock
  • React源码5 三大核心模块之一:render,renderRoot
  • MMYSQL刷题
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十一天
  • Typecho插件开发:优化文章摘要处理短代码问题
  • 【跟我学YOLO】(2)YOLO12 环境配置与基本应用
  • PID(进程标识符,Process Identifier)是什么?
  • Markdown编辑器--editor.md的用法
  • GTSuite许可管理
  • 学习日志10 python
  • 【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
  • JAVA青企码协会模式系统源码支持微信公众号+微信小程序+H5+APP
  • vlan作业
  • CommunityToolkit.Mvvm IOC 示例
  • 【Java】JUC并发(线程的方法、多线程的同步并发)
  • 定时器更新中断与串口中断
  • ArrayList列表解析
  • GCC属性修饰符__attribute__((unused))用途
  • 2025国自然青基、面上资助率,或创新低!
  • IPSec和HTTPS对比(一)
  • Java使用itextpdf7生成pdf文档
  • GAMES101 lec1-计算机图形学概述
  • 前端-CSS-day4
  • 边缘计算中模型精度与推理速度的平衡策略及硬件选型
  • 实战长尾关键词SEO优化指南提升排名
  • Go语言调度器深度解析:sysmon的核心作用与实现原理