【转】为什么volatile不能保证原子性而Atomic可以?

【转】为什么volatile不能保证原子性而Atomic可以?的相关文章

Java并发编程之验证volatile不能保证原子性

通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯哥Java:kaigejava)将通过代码演示来证明为什么说volatile不能够保证共享变量的原子性操作. 我们来举个现实生活中的例子: 中午去食堂打饭,假设你非常非常的饥饿,需要一荤两素再加一份米饭.如果食堂打饭的阿姨再给你打一个菜的时候,被其他人打断了,给其他人打饭,然后再回过头给你打饭.你选一荤两素再加一份米饭打完的过程被打断了四次耗时30分钟

java volatile不能保证原子性

Java中long和double赋值不是原子操作,因为先写32位,再写后32位,分两步操作,这样就线程不安全了.如果改成下面的就线程安全了private volatile long number = 8;那么,为什么是这样?volatile关键字难道可以保证原子性?java程序员很熟悉的一句话:volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性.但是我们这里的例子,volatile似乎是有时候可以代替简单的锁,似乎加了volatile关键字就省掉了锁.这不是互相矛盾吗? 其实如

Java线程-volatile不能保证原子性

下面是一共通过volatile实现原子性的例子: 通过建立100个线程,计算number这个变量最后的结果. package com.Sychronized; public class VolatileDemo { private volatile int number=0; public int getNumber() { return this.number; } public void increase() { this.number++; } public static void mai

为什么volatile能保证有序性不能保证原子性

对于内存模型的三大特性:有序性.原子性.可见性. 大家都知道volatile能保证可见性和有序性但是不能保证原子性,但是为什么呢? 一.原子性.有序性.可见性 1.原子性: (1)原子的意思代表着——“不可分”:(2)在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性.原子性是拒绝多线程交叉操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作.例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作. 2.可见性 线程执行结果在内存中对其它线程的可见

volatile是否就是原子性/线程同步的

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了同步块synchronized和volatile关键字机制. synchronized 同步块大家都比较熟悉,通过synchronized关键字来实现,所有加上synchronized和块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized修饰的方法 或者代码块

volatile关键字、原子性和可见性

1.volatile关键字 理解volatile的关键首先要理解处理器缓存和主存. 如果将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有读操作都可以看到这个修改,即volatile域的写操作会向主存刷新. 同步synchronized也会导致向主存中刷新,所以如果一个域完全由synchronized保护就不必设置为volatile. 2.原子性和可见性 可见性: 原子性:

java中volatile不能保证线程安全(实例讲解)

java中volatile不能保证线程安全(实例讲解) 转载  2017-09-04   作者:Think-007    我要评论 下面小编就为大家带来一篇java中volatile不能保证线程安全(实例讲解).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而不是从缓存

volatile足以保证数据同步吗

上一节已经了解了java内存模型,JMM为了提高执行性能,引入了工作内存和主存两个概念,在继续讨论之前必须先搞清四种存储介质:寄存器.高级缓存.RAM和ROM. RAM与ROM大家都比较熟悉了,可以看成是我们经常说的内存与硬盘,寄存器属于处理器里面的一部分,而高级缓存cache是CPU设计者为提高性能引入的一个缓存,也可以说是属于处理器的一部分.在利用CPU进行运算时必定涉及操作数的读取,假如CPU直接读取ROM,那么这个读取速度简直是无法忍受的,于是引入了内存RAM,这样做确实让速度提高了很多

volatile不能保证线程安全

在dpdk中,由于封装了原子量的操作.如 typedefstruct{ volatileint32_t cnt;/**< An internal counter value. */ }rte_atomic32_t; 但是很多人在使用的时候,经常如下使用 rte_atomic32_t pkt_count; pkt_count.cnt +=...... 这样在多线程中其实是很不安全的. 例子: #include<pthread.h> #include<stdio.h> volat