`
young-2017
  • 浏览: 9485 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Volatile关键字只具备可见性 不具备原子性

阅读更多

package com.example.threadDemo;

/**
 * volatile 关键字对多个线程具备可见性,但不保证原子性
 */
public class VolatileNoAtomic extends Thread {
    private static volatile int count;

    private static void addCount() {
        for (int i = 0; i < 1000; i++) {
            count++;
        }
        System.out.println(count);
    }

    @Override
    public void run() {
        addCount();
    }

    public static void main(String[] args){
        VolatileNoAtomic[] arr = new VolatileNoAtomic[10];
        for (int i = 0;i<10;i++){
            arr[i] =  new VolatileNoAtomic();
        }
        for (int i = 0;i<10;i++){
            arr[i].start();
        }
    }
}


最终结果期望是1000 * 10 = 10000
实际结果:
(使用 private static AtomicInteger count = new AtomicInteger(0);
            count.incrementAndGet();  可以得到原子性
  )
  • 大小: 65.2 KB
分享到:
评论

相关推荐

    面试官最爱的volatile关键字.docx

    然而,volatile并不具备synchronized的原子性保证。这意味着,对于volatile变量的读写操作是原子性的,但如果涉及到复合操作,例如i++这样的操作,volatile无法保证其原子性,因为在多线程环境下,这个操作可能被...

    Java线程:volatile关键字

    volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个...

    Java中volatile关键字的总结.docx

    但像`a++`和`a += 1`这样的复合操作不具备原子性。 2. **可见性** 可见性是指当一个线程修改了共享变量的值,其他线程能立即看到这一变化。`volatile`关键字可以保证可见性,当一个变量被`volatile`修饰后,线程...

    一文精通Java中的volatile关键字

    虽然`volatile`提供了轻量级的同步机制,但它并不具备`synchronized`的锁机制,无法保证原子性。例如,对于`flag = true;`这样的单次赋值操作,`volatile`可以保证其原子性,但对于`flag++`这样的复合操作,由于可能...

    多方面解读Java中的volatile关键字.rar

    3. **原子性**:`volatile`不具备原子性,这意味着对`volatile`变量的非基本类型(如数组或对象引用)的赋值操作可能不是原子的。例如,如果你有一个`volatile`整型变量,并且两个线程同时对其进行加一操作,结果...

    c# volatile 关键字的拾遗补漏

    同时,由于 volatile 不具备原子性,它通常不适用于需要原子操作的场景。 总结来说,C# 中的 volatile 关键字用于指示编译器在多线程环境中不要对变量进行优化,保证了变量的可见性,使得其他线程能够立即看到值的...

    java并发理论基础、可见性、原子性、有序性详解

    例如,`i += 1`操作在多线程环境下并不具备原子性,因为它涉及三个步骤:读取、计算和写回。如果没有适当的同步措施(如synchronized或AtomicInteger),线程切换可能导致结果不一致。 **有序性**: 程序执行的顺序...

    尚硅谷JUC视频笔记整理,很详细和全面,帮你迅速掌握JUC

    尽管volatile可以保证内存可见性,但它并不具备互斥性,也就是说,volatile关键字并不能保证操作的原子性。因此,对于多个线程同时写入同一个volatile变量的情况,还是需要采用锁机制来保证线程安全。 ### CAS算法 ...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    然而,对于一些复合操作(如`i++`),由于它们涉及到多次内存访问,因此在默认情况下并不具备原子性。 **案例分析**: ```java private static int counter = 0; public static void main(String[] args) { for ...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    volatile关键字用于保证变量的可见性和有序性。它确保了当一个线程修改了volatile变量的值时,其他线程可以立即看到这个新值,解决了Java内存模型导致的可见性问题。volatile的实现依赖于内存屏障,它确保在屏障前的...

    java内存模型.zip

    但要注意,volatile 不具备锁的特性,不能保证多线程环境下的数据一致性,对于多个操作的原子性问题无法解决。 7. synchronized 的用法:synchronized 可以修饰方法或者代码块,形成互斥锁,保证同一时刻只有一个...

    java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx

    尽管`volatile`变量提供了一定程度的线程安全性和可见性,但它并不具备`synchronized`块所提供的原子性特性。这意味着对于涉及多个变量更新的操作(如计数器的增减),`volatile`变量无法保证这些操作的整体原子性,...

    Java实习生面试复习(八):volatile的学习

    然而,`volatile`关键字并不能解决所有并发问题,因为它不具备**原子性**。例如,对于`i++`这样的操作,`volatile`并不能保证其原子性,因为它可以被分解为读、计算和写三个步骤,如果多个线程同时进行这个操作,...

    4_内存模型2

    在Java中,基础类型的读写操作通常具有原子性,但对于复合操作如自增(i++)或自减(i--)并不具备原子性。这是因为这些操作实际上涉及多个步骤,如读取、计算和存储,这些步骤在多线程环境下可能会交错执行,导致...

    基于同步机制解决Java多线程安全问题的应用 (1).zip

    volatile确保了内存可见性和有序性,但并不保证原子性。 3. Lock接口与ReentrantLock类:比synchronized更灵活的锁定机制,提供公平锁、非公平锁、可重入锁、读写锁等特性。ReentrantLock是Lock接口的一个实现,...

    Java高级面试题,经典多线程并发问题和答案

    其中,`volatile`关键字能保证线程间的可见性,但不能保证原子性。 3. **有序性**: - **定义**:有序性意味着程序的执行顺序遵循代码的先后顺序。 - **作用**:确保程序的行为符合预期,避免因指令重排序导致的...

    Java volatile的适用场景实例详解

    volatile 变量具有 synchronized 的可见性特性,但是不具备原子性。这意味着线程能够自动发现 volatile 变量的最新值。 volatile 变量的使用条件是非常有限的,只能应用于多个变量之间或者某个变量的当前值与修改后...

    java 并发编程 多线程

    - **volatile关键字**:`volatile`主要用于解决可见性和禁止指令重排序的问题,但不保证操作的原子性。 - 可见性:当一个线程修改了一个`volatile`变量时,新值对其他线程来说是立即可见的。 - 指令重排序:`...

    Java内存模型分析与其在编程中的应用.zip

    理解volatile并不能保证所有的线程安全,仅能保证可见性和有序性,但不具备原子性,所以在需要原子操作时,应该使用Atomic类或者synchronized。 此外,合理使用ThreadLocal也是优化多线程程序的一种方式。...

Global site tag (gtag.js) - Google Analytics