博客
关于我
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/

    你可能感兴趣的文章
    PHP学习总结(3)——PHP入门篇之PHP的echo语句
    查看>>
    PHP学习总结(4)——PHP入门篇之PHP计算表达式
    查看>>
    PHP学习总结(5)——PHP入门篇之PHP字符串
    查看>>
    PHP学习总结(6)——PHP入门篇之PHP语句结束符
    查看>>
    PHP学习总结(7)——PHP入门篇之PHP注释
    查看>>
    rabbitmq重启失败
    查看>>
    PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
    查看>>
    php学习笔记---php调试和开发工具整理
    查看>>
    PHP学习笔记一:谁动了你的mail(),PHP?
    查看>>
    PHP安全实战
    查看>>
    php安装扩展
    查看>>
    rabbitmq重启
    查看>>
    php实现上传(多个)文件函数封装
    查看>>
    php实现下载文件方法
    查看>>
    php实现单链表
    查看>>
    php实现图片背景换色功能
    查看>>
    php实现多个一维数组对应合并成二维数组
    查看>>
    php实现多关键字查找方法
    查看>>
    PHP实现微信公众号H5支付
    查看>>
    PHP实现微信公众号网页授权
    查看>>