深度理解volatile关键字
时间:2022-07-26
本文章向大家介绍深度理解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关键字适用于一个线程写,多个线程读的场景,因为他只能保证可见性,不能保证原子性
- 厚土Go学习笔记 | 31. 错误 通常函数会返回一个error值来判断是否出错
- 厚土Go学习笔记 | 30. Stringers的一个练习
- 黑客游戏| Owasp juice shop (一)
- 厚土Go学习笔记 | 29. 接口
- Golang中Interface类型详解
- 反序列化| 我欲修仙,法力无边。
- Go语言的网络编程简介
- golang基于redis lua封装的优先级去重队列
- 厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法
- 41. select阻塞一个gorountine上的多个通讯操作 | 厚土Go学习笔记
- 40. range和channel的close | 厚土Go学习笔记
- 48. 访问MySql数据库增删改查和连接池及空字段处理 | 厚土Go学习笔记
- Go语言·我的性能我做主
- 量子计算对 bitcoin 的威胁
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法