最轻量的同步机制

获取被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关键字的更多相关文章

  1. Java并发专题(三)深入理解volatile关键字

    前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要 ...

  2. 深入理解volatile关键字

    Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作内存 ...

  3. 对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

    一:背景 1. 讲故事 昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为:[C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/will ...

  4. Java并发编程学习笔记 深入理解volatile关键字的作用

    引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...

  5. 【java并发】(1)深入理解volatile关键字

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  6. 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字

    目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...

  7. [C#.NET 拾遗补漏]10:理解 volatile 关键字

    要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理.比如对于下面这段代码: public class Example { public int x; public v ...

  8. 彻底理解volatile关键字

    1. volatile简介 在上一篇文章中我们深入理解了java关键字,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下 ...

  9. 深入理解 volatile 关键字

    volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内存模型.如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解 Java 内 ...

随机推荐

  1. Java 语法 try catch使用容易忽略的细节 BigDecimal

    try catch使用细节 一. try catch的使用方式容易理解,两者最终都要执行finally中的代码,而当return在try和catch中又会有什么效果? 如果我们做一个简单的例子就会发现 ...

  2. CSS动画实例:旋转的圆角正方形

    在页面中放置一个类名为container的层作为效果呈现容器,在该层中再定义十个名为shape的层层嵌套的子层,HTML代码描述如下: <div class="container&qu ...

  3. CVT1100 错误的修复 2009-10-12 11:38

    我们在用VS2005编译MFC工程时极少会出现如下错误: 一,CVTRES : fatal error CVT1100: 重复的资源.type:MANIFEST, name:1, language:0 ...

  4. python使用mongodb--基础操作(增、删、改、查)

    连接数据库 client = pymongo.MongoClient(host="127.0.0.1", port=6666) db = client['Media'] db.au ...

  5. javascript 数组的组合

    javascript 数组的组合 一.前言 二.数组的组合 concat()方法 push(...items) 其他方法 三.结束语 一.前言 今天在开发项目过程中,遇到了一个需求,先请求了30个数据 ...

  6. Pytools1.0.0发布啦!

    大家赶紧来看看,特别好用的. 文档: This is pytools modulethe module is use MIT license MIT License Copyright (c) 202 ...

  7. 使用docker搭建redis集群

    创建网卡 docker network create redis --subnet 172.20.0.0/ --gateway 172.20.0.1 通过脚本创建6个redis配置 for i in ...

  8. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

    Linux下安装MySQL执行scripts/mysql_install_db --user=mysql脚本时,报错如下: Filling help tables...2019-12-24 16:46 ...

  9. 对于CSS里面我之前不太清楚的伪类,我做一些总结

    格式: 标签 + : + 参数 +{ 可填背景颜色,字体颜色,鼠标样式,加粗等 } a:hover{ color:#f40;} :link表示鼠标点击之前的样式 :hover表示鼠标放上去的样式 :a ...

  10. Istio的流量管理(实操三)

    Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...