深度理解volatile关键字
最轻量的同步机制
获取被volatile修饰的变量的时候,每次都要从主内存中获取
设置被volatile修饰的变量的时候,每次都要刷回主内存当中
当其他线程调用的时候,会将自己线程当中保存的变量值置为无效,然后重新重主内存获取
在读取和写入到主内存的时候,不会进行加锁,所以称之为最轻量的同步机制
volatile不是线程安全的,他只能保证变量的可见性,无法保证其原子性,如果设置的时候采用运算方式,那么将无法保证线程安全
运算方式
public volatile int age = 200; set age = age+20; // 无法保证操作的原子性 这就是运算赋值(简写)

测试用例:
package org.dance.day1.vola; import org.dance.tools.SleepTools; /**
* volatile无法保证操作的原子性
* @author ZYGisComputer
*/
public class VolatileUnsafe { private static class VolatileVar implements Runnable{ private volatile int a = 0; @Override
public void run() {
String name = Thread.currentThread().getName();
a = a + 1;
System.out.println(name + ":" + a);
SleepTools.ms(100);
a = a + 1;
System.out.println(name + ":" + a);
}
} public static void main(String[] args) {
VolatileVar volatileVar = new VolatileVar();
Thread thread = new Thread(volatileVar);
Thread thread1 = new Thread(volatileVar);
Thread thread2 = new Thread(volatileVar);
Thread thread3 = new Thread(volatileVar);
thread.start();
thread1.start();
thread2.start();
thread3.start();
} }
返回测试结果:
Thread-0:1
Thread-3:4
Thread-2:3
Thread-1:2
Thread-0:5
Thread-1:7
Thread-2:6
Thread-3:5
可以看见volatile无法保证操作的原子性
所以说volatile关键字适用于一个线程写,多个线程读的场景,因为他只能保证可见性,不能保证原子性
作者:彼岸舞
时间:2020\09\15
内容关于:并发编程
本文属于作者原创,未经允许,禁止转发
深度理解volatile关键字的更多相关文章
- Java并发专题(三)深入理解volatile关键字
前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要 ...
- 深入理解volatile关键字
Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作内存 ...
- 对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相
一:背景 1. 讲故事 昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为:[C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/will ...
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- 【java并发】(1)深入理解volatile关键字
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
- 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字
目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...
- [C#.NET 拾遗补漏]10:理解 volatile 关键字
要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理.比如对于下面这段代码: public class Example { public int x; public v ...
- 彻底理解volatile关键字
1. volatile简介 在上一篇文章中我们深入理解了java关键字,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下 ...
- 深入理解 volatile 关键字
volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内存模型.如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解 Java 内 ...
随机推荐
- neo4j批量导入数据的两种解决方案
neo4j批量导入数据有两种方法,第一种是使用cypher语法中的LOAD CSV,第二种是使用neo4j自带的工具neo4j-admin import. LOAD CSV 导入的文件必须是csv文件 ...
- 学习Python(新手教程链接)
1.这个是地址: https://www.ggdoc.com/cHl0aG9uIG1zaeaYr_S7gOS5iA2/NTY4Nzc1MWQxMDJkZTJiZDk3MDU4OGE20/
- 根据pid获得路径 2006-10-25 19:28
这是编写kill process时用到的 BOOL GetProcessModule(DWORD dwPID, DWORD dwModuleID, LPMODULEENTRY32 lpMe32, DW ...
- linux下使用vim创建编辑文件
vi/vim 使用实例 如果要想用vim/vi创建一个文件(使用命令): vim test.txt 不管文件存在与否 直接输入 vi 文件名 就能够进入 vi 的一般模式 按下 i 进入输入模式( ...
- src rpm 下载地址
drbd: http://mirror.rackspace.com/elrepo/elrepo/el7/SRPMS/ rabbitmq: https://dl.bintray.com/rabbitmq ...
- 算法-搜索(5)m路搜索树
动态m路搜索树即系统运行时可以动态调整保持较高搜索效率的最多m路的搜索树.以3路搜索树为例说明其关键码排序关系: const int MaxValue=; template <class T ...
- 牛客网PAT练兵场-部分A+B
题解:简单循环 题目地址:https://www.nowcoder.com/questionTerminal/fb581ea099a14f5d97c6149cbeee249f /** * *作者:Yc ...
- 企业站如何做长尾关键词seo优化
http://www.wocaoseo.com/thread-315-1-1.html 很多企业站,优化到一定程度后网站的流量很快就上去了,但是之后网站就无法更进一步.那么对于普通中小型企业站 ...
- Laravel Facade原理及使用
Laravel Facade原理及使用 laravel过于庞大,加之笔者水平有限,所以后面的源码解读会按模块功能介绍,希望能帮大家稍微捋顺下思路,即使能够帮助大家回顾几个函数也好.如发现错误,还望指正 ...
- webpack打包初始入门教程
Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 从图中我们可以看出,Webpack 可以将多种静态资源 js.css ...