以前一直没在意,一直以为volatile修饰了就高枕无忧了,但其实不然,最简单的一个场景:
public class Counter { public volatile static int count = 0; public static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread.sleep(1); } catch (InterruptedException e) { } count++; } public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { Counter.inc(); } }).start(); } //这里每次运行的值都有可能不同,可能为1000 System.out.println("运行结果:Counter.count=" + Counter.count); } }
里运行结果依然不是期望的1000,主要原因简单解释如下:
对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的
例如假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值
在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6
线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6
导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。
相关推荐
Java多线程volatile关键字详解 Java多线程volatile关键字详解主要介绍了Java多线程volatile关键字的应用和原理。volatile是一种轻量同步机制,可以确保变量的可见性和顺序性,但不保证原子性。 volatile关键字的...
Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...
Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见性是一种复杂的属性,因为可见性...
### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...
`volatile`关键字在Java多线程编程中起到了重要的作用,它提供了轻量级的同步机制,保证了共享变量的可见性。然而,它并不提供原子性保证,因此在处理复合操作时需谨慎使用。在设计并发程序时,理解`volatile`的工作...
同样,当写入`volatile`变量时,会立即写回主内存,保证了多线程环境下的数据一致性。 5. **使用场景**:`volatile`常用于以下场景: - 单例模式中的双重检查锁定(Double-Check Locking),确保实例化过程线程...
Java并发编程中,volatile关键字扮演着重要的角色,它是一种轻量级的同步机制,与synchronized相比,volatile在性能上更优,因为它不会导致线程阻塞。在深入理解volatile的关键特性之前,我们需要先了解Java内存模型...
Java 中的 volatile 关键字是 Java 并发编程中的一种关键字,它用于修饰变量,确保在多线程环境下变量的可见性和有序性。volatile 关键字的主要作用是防止编译器对变量的读写优化,确保线程之间的可见性和有序性。 ...
volatile关键字可以使变量在多线程之间可见,确保变量的最新值被所有线程看到。 在Java内存模型中,内存分为主内存和工作内存,每个线程有自己的工作内存,对于要操作的数据会从主内存拷贝一份到工作内存中,默认...
`volatile`关键字在Java语言中主要用于支持多线程环境下的变量访问安全性。它主要提供了以下两个特性: 1. **可见性**:当一个线程修改了一个被`volatile`关键字修饰的变量后,其他线程能够立即感知到这一变化。 2. ...
深入理解Java中的volatile关键字 Java中的volatile关键字是一个非常重要的概念,它不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。volatile关键字的主要作用是提供可见性、原子性和...
总结来说,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了线程安全和数据一致性。然而,正确理解和使用它是至关重要的,避免滥用并结合其他并发控制手段,才能编写出高效且健壮的多线程程序。在实际...
volatile关键字是Java语言中的一种机制,用于保证变量在多线程之间的可见性。它是Java.util.concurrent包的核心,没有volatile就没有那么多的并发类供我们使用。本文详细解读一下volatile关键字如何保证变量在多线程...
在Java中,volatile关键字是解决多线程问题的重要工具。本文将会详细介绍volatile关键字的原理、使用场景和注意事项。 知识点1:理解多线程问题 在多线程环境下,线程安全问题是最重要的问题。Java内存模型(JMM)...
在C++中,volatile关键字的定义与Java中的volatile关键字不同。C++中的volatile关键字主要用于提供对特殊地址的稳定访问,而不是用于线程同步。 在编译器对代码的优化中,编译器可能会对代码进行修改,以提高代码的...
Java多线程volatile原理及用法解析 Java多线程volatile原理及用法解析是Java多线程编程中一个非常重要的概念。volatile关键字是Java语言中的一个关键字,它可以保证线程之间的可见性和禁止指令重排序。 保证线程...
Volatile关键字是Java语言中的一种关键字,主要用于解决多线程编程中的可见性、原子性和有序性问题。本文将详细介绍Volatile关键字的相关知识,并通过代码帮助大家更好地理解和学习。 一、基本概念 在Java内存模型...
在Java中,Volatile关键字可以用于解决可见性问题,例如在多线程环境下,一个线程修改的变量对另一个线程是可见的。但是,Volatile关键字不能解决原子性问题,例如a++操作是一个非原子操作,需要使用同步技术来让它...
总结来说,volatile关键字在Java多线程编程中起着关键作用,它提供了轻量级的同步机制,通过内存屏障保证了变量的可见性和有序性,避免了多线程环境下数据不一致的问题。但需要注意的是,volatile不能保证操作的原子...
而在多线程环境下,通过`volatile`、`synchronized`和`Lock`可以保证一定的有序性,避免指令重排序带来的问题。 ### 二、锁的互斥与可见性 1. **互斥** 锁的互斥性确保在同一时间只有一个线程可以持有特定的锁,...