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

volatile 对 int 和 long 修改的区别

volatile 对 int 和 long 修改的区别

volatile 关键字在 Java 中用于保证变量的可见性和有序性,但对于不同基本数据类型(特别是 intlong),其行为有一些重要区别。

主要区别

1. 原子性差异

  • 对于 int (32位)

    • volatile int 的读写操作是原子性
    • 在32位和64位JVM上都是原子操作
  • 对于 long (64位)

    • 在32位JVM上,volatile long 的读写不是原子性的(可能被拆分为两个32位操作)
    • 在64位JVM上,volatile long 的读写是原子性
    • Java 5+ 的 JMM (Java内存模型) 保证在64位JVM上 volatile long 的原子性

2. 性能考虑

  • volatile long 在32位架构上可能有更高的开销,因为需要保证64位操作的原子性
  • volatile int 在所有平台上性能差异不大

底层原理

32位JVM上的 long 处理

在32位架构上,64位的 long 操作可能需要两条指令完成:

volatile long value = 0L;// 写操作可能被拆分为两个32位写
value = 0x123456789ABCDEF0L; 
// 实际可能执行:
// 写入低32位 (0x9ABCDEF0)
// 写入高32位 (0x12345678)

volatile 保证这些操作的有序性和可见性,但在32位JVM上不保证这两部分操作的原子性。

实际影响

线程安全场景

// 安全 - volatile int 总是原子操作
volatile int intValue;// 在64位JVM安全,32位JVM不安全
volatile long longValue; 

解决方案

如果需要保证 long 在32位JVM上的原子性:

  1. 使用 AtomicLong

    AtomicLong atomicLong = new AtomicLong();
    
  2. 加锁同步

    private final Object lock = new Object();
    private long value;public void setValue(long v) {synchronized(lock) {this.value = v;}
    }
    

JVM实现差异

JVM类型int (32位)long (64位)
32位JVM原子操作非原子操作
64位JVM原子操作原子操作

最佳实践

  1. 对于计数器等简单场景,优先使用 volatile int
  2. 在32位JVM环境需要原子性long操作时,使用 AtomicLong
  3. 在64位JVM上,volatile long 可以安全使用
  4. 考虑使用 @Contended 注解防止伪共享(Java 8+)

总结:volatileint 的修改在所有平台上都是原子性的,而对 long 的修改在32位JVM上不具有原子性,这是两者最关键的差异。

相关文章:

  • 傅里叶级数从三角函数形式到复指数形式的完整推导步骤
  • Chapter10-XXE
  • C++ 内存泄露
  • 【机械视觉】Halcon—【十三、实例找各个区域面积和中心点】
  • Bambu Studio 中的“回抽“与“装填回抽“的区别
  • 数据赋能(256)——数据赋能业务——产品和服务变现
  • 山东大学软件学院创新项目实训开发日志——第十六周
  • sd调试记录(标准库 + keil + RL-FlashFS):
  • 芯片测试之 trim修调详解
  • 人工智能嵌入公共服务治理的风险挑战(三)
  • Kerberos快速入门之基本概念与认证基本原理
  • Java延时
  • 【Qt】QStateMachine状态机-实现播放按钮状态切换
  • Python Day51 学习(日志Day20复习)
  • AIGC 基础篇 Python基础(练习1)
  • Phthon3 学习记录-0613
  • 英伟达诉求1亿IOPS SSD:打破AI算力存储瓶颈
  • 源码开发详解:搭建类似抖音小店的直播带货APP需要掌握哪些技术?
  • 强化学习入门:价值、回报、策略概念详解
  • 本地密码生成管理工具,自定义生成密码
  • 网站制作公司业务员/南昌网站seo外包服务
  • 2017做哪些网站致富/百度官网客服
  • 丽江北京网站建设/网站推广应该坚持什么策略
  • 网站建设超链接字体变色代码/百度深圳总部
  • 广州建设网站技术/网络营销有哪些形式
  • 济南冰河世纪网站建设/青岛seo杭州厂商