多线程--Volatile关键字

简介: 多线程--Volatile关键字

@[toc]

Volatile关键字

线程三大特性

首先了解Voiatile关键字,需要了解线程的三大特性

1. 原子性: 要么成功,要么失败
2. 可见性: 多个线程同时访问一个变量时,一个线程修改了这个变量值,其他线程立马可以看到
3. 有序性: 程序的执行顺序按现在的顺序

了解了线程3大特性,我们就可以深入了解Volatile关键字了


什么是Volatile

Volatile是java虚拟机提供的轻量级同步机制

  • 保证了可见性
  • 禁止指令重排序
  • 不能保证原子性

可见性详解

可见性是说一旦某个线程修改了被Volatile修饰的变量,他会保证修改的值立马被更新到主内存,其他线程访问时可以立即获取修改的值,如下代码

public volatile Integer a = 1;

在java中为了加快程序运行效率,对于一些变量操作,常量,是在线程寄存器 或是 CPU缓存进行的,之久才会同步主内存,而加了Volatile后直接读写主内存

Volatile保证了了变量可见性,但是不能保证原子性
.

原子性详解

要么成功,要么失败 为什么Volatile 不能保证原子性

public volatile int a = 1;
    
    public  void add(){
        a++;
    }

如果有多条线程同时调用add方法

1.从主内存 获取 数据
2.进行+1操作
3.写回主内存
如果同时调用都会读取到 比如 0 都会同时 +1 ,循环100次 ,可能会导致打印出来结果小于 100

禁止指令重排序

指令重排序是指cpu采用了允许多条指令不安程序规定顺序分开给各个电路单元处理

因此,加上Volatile 关键字后可以防止进行排序

性能

Volatile 读性能和普通变量差不多,但写操作慢,他需要在本地代码插入许多内存屏障指令,不发生乱序

Volatile与Synchronized区别

(1)从而我们可以看出volatile虽然具有可见性但是并不能保证原子性。
(2)性能方面,synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。
但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。


相关文章
|
3月前
|
存储 SQL 缓存
揭秘Java并发核心:深度剖析Java内存模型(JMM)与Volatile关键字的魔法底层,让你的多线程应用无懈可击
【8月更文挑战第4天】Java内存模型(JMM)是Java并发的核心,定义了多线程环境中变量的访问规则,确保原子性、可见性和有序性。JMM区分了主内存与工作内存,以提高性能但可能引入可见性问题。Volatile关键字确保变量的可见性和有序性,其作用于读写操作中插入内存屏障,避免缓存一致性问题。例如,在DCL单例模式中使用Volatile确保实例化过程的可见性。Volatile依赖内存屏障和缓存一致性协议,但不保证原子性,需与其他同步机制配合使用以构建安全的并发程序。
71 0
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
47 0
|
3月前
|
缓存 Java
【多线程面试题二十三】、 说说你对读写锁的了解volatile关键字有什么用?
这篇文章讨论了Java中的`volatile`关键字,解释了它如何保证变量的可见性和禁止指令重排,以及它不能保证复合操作的原子性。
|
4月前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
58 1
|
4月前
|
微服务
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么
|
4月前
线程可见性和关键字volatile
线程可见性和关键字volatile
|
4月前
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
40 0
|
4月前
|
算法 安全 Java
Java面试题:解释JVM中的堆内存分代收集策略,并讨论年轻代和老年代的特点,描述Java中的线程池,并解释线程池的优点,解释Java中的`volatile`关键字的作用和使用场景
Java面试题:解释JVM中的堆内存分代收集策略,并讨论年轻代和老年代的特点,描述Java中的线程池,并解释线程池的优点,解释Java中的`volatile`关键字的作用和使用场景
47 0
|
4月前
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
59 0
|
5月前
|
Java
synchronized关键字在Java中为多线程编程提供了一种简便的方式来管理并发,防止数据竞争和死锁等问题
Java的`synchronized`关键字确保多线程环境中的数据一致性,通过锁定代码段或方法防止并发冲突。它可修饰方法(整个方法为临界区)或代码块(指定对象锁)。例如,同步方法只允许一个线程执行,同步代码块则更灵活,可锁定特定对象。使用时需谨慎,以避免性能影响和死锁。
34 0