美文网首页
volatile的理解

volatile的理解

作者: 天台上思考的唐吉诃德 | 来源:发表于2019-08-17 17:06 被阅读0次
1.简介

volatile作为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中值的更新会使缓存中的值失效(非volatile变量不具备这样的特性,非volatile变量的值会被缓存,线程A更新了这个值,线程B读取这个变量的值时可能读到的并不是是线程A更新后的值)。volatile会禁止指令重排。

2.volatile特性

volatile具有可见性、有序性,不具备原子性。
注意,volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异,这一点在面试中也是非常容易问到的点。

下面来分别看下可见性、有序性、原子性:
a.原子性:如果你了解事务,那这个概念应该好理解。原子性通常指多个操作不存在只执行一部分的情况,如果全部执行完成那没毛病,如果只执行了一部分,那对不起,你得撤销(即事务中的回滚)已经执行的部分。
b.可见性:当多个线程访问同一个变量x时,线程1修改了变量x的值,线程1、线程2...线程n能够立即读取到线程1修改后的值。
c.有序性:即程序执行时按照代码书写的先后顺序执行。在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。(本文不对指令重排作介绍,但不代表它不重要,它是理解JAVA并发原理时非常重要的一个概念)。

3.volatile适用场景

a.适用于对变量的写操作不依赖于当前值,对变量的读取操作不依赖于非volatile变量。
b.适用于读多写少的场景。
c.可用作状态标志。
d.DK中volatie应用:JDK中ConcurrentHashMap的Entry的value和next被声明为volatile,AtomicLong中的value被声明为volatile。AtomicLong通过CAS原理(也可以理解为乐观锁)保证了原子性。

4.volatile VS synchronized

volatilesynchronized修饰对象修饰变量修饰方法或代码段可见性11有序性11原子性01线程阻塞01对比这个表格,你会不会觉得synchronized完胜volatile,答案是否定的,volatile不会让线程阻塞,响应速度比synchronized高,这是它的优点。

相关文章

  • Volatile理解

    Java Volatile1. volatile 理解2. volatile 不保证原子性3. Volatile ...

  • 谈谈对Volatile的理解

    谈谈对Volatile的理解 带着BAT大厂的面试问题去理解volatile volatile关键字的作用是什么?...

  • 多线程5:彻底理解volatile

    彻底理解volatile

  • 死磕Java——volatile的理解

    一、死磕Java——volatile的理解 1.1.JMM内存模型 理解volatile的相关知识前,先简单的认识...

  • 死磕Java——volatile的理解

    一、死磕Java——volatile的理解 1.1.JMM内存模型 理解volatile的相关知识前,先简单的认识...

  • 希望是volatile的最后一次理解

    第一次理解: 刚学java时,对于volatile的记忆就是: volatile保证可见性 volatile防止指...

  • volatile的理解

    volatile的理解 首先上代码 运行这段代码,把jvm设置为server模式,主线程在启动子线程后,休眠1s,...

  • volatile的理解

    1.简介 volatile作为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile...

  • volatile 的理解

    文章目录 前言 通过一系列的问题,了解volatile 总结 前言 在面试的时候,经常会遇到多线程的问题,然后面试...

  • 理解volatile

    Java并发编程:volatile关键字解析

网友评论

      本文标题:volatile的理解

      本文链接:https://www.haomeiwen.com/subject/gjjksctx.html