`

volatile和原子操作

 
阅读更多

volatile 可以保证变量的原子性和可视性。。 但不能保证原子操作,如++,-- 等均不是原子操作。 如需操作请使用synchronized关键字 或 Lock锁。

 

原子操作为,变量的取值和赋值。

 

volatile 保证的是long和double的原子性,因为这两个变量为64位,在JVM 中处理时看做32位,所以在并发时变量需要加上volatile修饰,保证在赋值等处理时,不会发生数据断开的情况。

 

当并发的共享变量需要返回,或者在多处引用时,需要注意该共享变量的可视性,保证取得的是内存中的最新值, 加入volatile修饰即可。

 

http://xiabin1235910-qq-com.iteye.com/admin/blogs/1571669 详细讲解了 volatile的使用及注意事项。非常有用,详细了解。

 

在windows核心编程一书中,用户模式下的线程同步这一章,206页  也提到volatile的使用。

保证变量每一次都从内存中取得最新值,而不是在编译器优化后,重复取得cpu寄存器的值。

 

详见 java编程思想并发一章的原子性与可视性。

分享到:
评论

相关推荐

    volatile和原子操作有没有关系,我的实验+别人论文

    对volatile的原子性做探究,加上自己的实验代码和实验结果! Case多核?单核?是否有volatile是否编译器优化-O2结果!

    Java——volatile关键字详解

    volatile保证可见性和禁止指令重排序,底层是通过“内存屏障”来实现,但不保证原子性。 写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块。 volatile的使用场景 对变量的写入操作不...

    Java并发:volatile内存可见性和指令重排

     此外需注意volatile并不保证操作的原子性。  (一)内存可见性  1 概念  JVM内存模型:主内存和线程独立的工作内存  Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立...

    解开Volatile的面纱V1.1

    无论是在面试时,还是在实际开发中,高并发问题已经成为了现在的主旋律。并发问题的定位和重 现是一件很棘手且难以解决的事情,为了尽可能的减少并发问题的...1. 原子性:原子性就是说一个操作不能被打断,要么执行完

    Java并发学习-AtomicIntegerFieldUpdater字段原子更新类.docx

     也就是说调用者能够直接操作对象字段 ,那么就可以反射进行原子操作。 对于父类的字段,子类是不能直接操作的,尽管子类可以访问父类的字段。 只能是实例变量,不能是类变量,也就是说不能加static关键字。 ...

    C#多线程编程中的锁系统(二)

    这一次我们说说升级锁和原子操作。 目录 1:volatile 2: Interlocked 3:ReaderWriterLockSlim 4:总结 一:volatile 简单来说: volatile关键字是告诉c#编译器和JIT编译器,不对volatile标记的字段做任何的缓存。...

    程序员为什么还要刷题-atomique:基于C++11内存模型的.NET的理智原子操作

    目标是用户应该能够编写无锁数据结构和算法,而不必求助于Thread.VolatileRead和Thread.VolatileWrite方法,或Interlocked和Volatile类。 常问问题 为什么是 C++11 内存模型? 简而言之:因为它变得无处不在。 C++11...

    JUC–Atomic原子类

    原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义...

    C++ 原子类型

    文章目录atomic构造赋值访问特化操作atomic_flag构造操作内存序 原子对象可以保证:从不同的线程访问其包含的数据不会造成数据竞争。此外,它还能够同步不同线程对内存的访问。 atomic 构造 default (1) atomic()...

    Java中Volatile关键字步骤

    基本概念 Java内存模型中的可见性,原子性和有序性 可见性:  可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是...

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

     volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i ... 原子操作类 AtomicInteger等 相当于加上synchronized 也有些利用硬件底层能力CAS

    【2018最新最详细】并发多线程教程

    24.Java中atomic包中的原子操作类总结 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier 26.大白话说java并发工具类-Semaphore,Exchanger 27.一篇文章,让你彻底弄懂生产者--消费者问题

    彩虹岛启动器qtga.dll

    volatile 并不能保证原子性 想象一下,如果线程T1将一个值为0的共享计数器变量读入其CPU缓存,则将其递增为1,并没有将更改后的值写回主内存。 然后线程T2可以将相同的计数器变量从主内存(此刻变量值仍然为0)...

    并发编程面试专题.pdf

    7) 什么是原子操作,Java 中的原子操作是什么? 8) Java 中的 volatile 关键是什么作用?怎样使用它?在 Java 中它跟 synchronized 方法有什么不同? 9) 什么是竞争条件?你怎样发现和解决竞争? 10) 你将如何使用 ...

    聊聊并发系列文章

    5. 聊聊并发(五)原子操作的实现原理 6. 聊聊并发(六)ConcurrentLinkedQueue的实现原理 7. 聊聊并发(七)Java中的阻塞队列 8. 聊聊并发(八)Fork/Join框架介绍 9. 聊聊并发(九)Java中的CopyOnWrite容器 10. ...

    JAVA实现Modbus RTU或Modbus TCPIP数据采集.rar

    5.将复合操作放在一个原子操作中执行,或用相同的锁来保护每个共享的和可变的变量。 6.增加同步必然会导致代码的复杂性,为性能牺牲代码简单性时不要太盲目,因为越复杂的代码,其不安全性越大。

    atomicReference 使用和AtomicStampedReference 解决ABA的问题.docx

    就是俩个线程同事操作,有可能有一个线程已经处理结束,那么第一个线程中间又一次fail操作,会在这个结果上在进行计算 t1 t2 A A->B->A A->C 那我们来看下维基百科上面的形象描述: 你拿着一个装满钱的手提箱在飞机场,...

    Java并发编程实战

    3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用...

Global site tag (gtag.js) - Google Analytics