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

    你可能感兴趣的文章
    poj1182(带权并查集)
    查看>>
    POJ1182(带权并查集)
    查看>>
    Qt笔记——Qt初探、PyQt5和Qt5
    查看>>
    poj1190生日蛋糕
    查看>>
    POJ1218 HDU1337 ZOJ1350 UVALive2557 THE DRUNK JAILER
    查看>>
    poj1222 EXTENDED LIGHTS OUT(gauss)
    查看>>
    POJ1240 m叉树
    查看>>
    Poj1328--Radar Installation(区间选点)
    查看>>
    POJ1384Piggy-Bank(DP)
    查看>>
    POJ1417 True Liars —— 并查集 + DP
    查看>>
    Poj1459 Power Network 预流推进
    查看>>
    POJ1502(MPI Maelstrom)
    查看>>
    poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
    查看>>
    poj1730 - Perfect Pth Powers(完全平方数)(水题)
    查看>>
    poj1753——Flip Game
    查看>>
    poj1936 假期计划第一水
    查看>>
    poj1958-汉诺四塔问题(三种方法)
    查看>>
    poj1988(并查集)
    查看>>
    POJ2007+几何+极角排序
    查看>>
    poj2039
    查看>>