博客
关于我
long,double在多线程中的情况
阅读量:393 次
发布时间:2019-03-05

本文共 641 字,大约阅读时间需要 2 分钟。

Java的内存模型确保了基本变量的读写操作是原子操作,但对于64位的long和double类型,JVM将读写操作分解为两个32位操作,这可能导致多个线程读取同一变量时出现数据不一致的情况。为了在线程间共享long和double字段,必须确保可见性和原子性。

可见性与原子性的区别

  • 可见性:volatile确保变量的可见性,所有线程都能看到变量的最新值。例如,一个线程修改了一个非volatile变量,其他线程会立即看到这个变化。

  • 原子性:volatile不保证原子性。即使变量是volatile的,读写操作也可能被分解为多次操作,导致数据不一致。例如,一个long变量会被分解为两个32位操作,可能导致高低位读取不一致。

解决方法

为了保证原子性,需要使用同步机制:

  • synchronized块:通过互斥机制保证线程进入同步块时的原子性操作。
  • Lock对象:使用ReentrantLock或其他锁机制,确保资源的独占访问。
  • 示例

    假设有一个非volatile长变量value,多个线程同时读取和写入。由于长是64位,读写操作会被分解为两个32位操作。例如,线程A读取高位,线程B读取低位,可能导致value不一致。使用synchronized块或Lock对象可以确保在读写时的原子性,避免数据错乱。

    总结

    volatile确保可见性,但不保证原子性。在线程间共享long和double字段时,必须使用同步机制来保证读写操作的原子性。通过结合可见性和原子性,确保多线程环境下的正确性。

    转载地址:http://lyjzz.baihongyu.com/

    你可能感兴趣的文章
    MySQL数据库备份实战
    查看>>
    Mysql数据库备份的问题:mysqldump: Got error: 1049: Unknown_无需整理
    查看>>
    mysql数据库如何重置密码是多少钱_MySQL数据库忘记root密码如何重置修改
    查看>>
    MySQL数据库安装配置与常用命令
    查看>>
    MySQL数据库实现主从同步数据
    查看>>
    mysql数据库导入导出_windows系统以及linux系统下的操作---linux工作笔记042
    查看>>
    mysql数据库导出导入
    查看>>
    MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)
    查看>>
    mysql数据库常用命令
    查看>>
    MySQL数据库必会的增删查改操作(CRUD)
    查看>>
    MySQL数据库性能分析与调优实践
    查看>>
    mysql数据库扫盲,你真的知道什么是数据库嘛
    查看>>
    mysql数据库批量插入数据shell脚本实现
    查看>>
    MySQL数据库操作
    查看>>
    MySQL数据库故障排错
    查看>>
    MySQL数据库无法远程连接的解决办法
    查看>>
    mysql数据库时间类型datetime、bigint、timestamp的查询效率比较
    查看>>
    MySQL数据库服务器端核心参数详解和推荐配置(一)
    查看>>
    mysql数据库死锁的产生原因及解决办法
    查看>>
    MySQL数据库的事务管理
    查看>>