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

    你可能感兴趣的文章
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    mutiplemap 总结
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>