volatile关键字用处和场景?

news/2024/7/24 4:48:13 标签: java, jvm, 开发语言

什么是volatile关键字

在C语言和Java中,它是一种特殊的类型修饰符,用来告诉编译器该变量可能会被意外地改变。这样,每次存取该变量时,编译器都不会对其进行缓存优化,而是直接从内存中读取或写入,提供了对特殊地址的稳定访问。在Java中,volatile提供了一种比synchronized更轻量级的同步机制,因为它不会引起线程上下文的切换和调度。但相较于synchronized,它的同步性较差,使用时需谨慎以避免出错。

用处

线程都有自己的工作内存,对一个共享变量的修改可能不会立即对其他线程可见。使用volatile关键字可以确保当一个线程修改了一个volatile变量的值,这个改变会立即被其他线程看到,从而保证了不同线程间对该变量操作的可见性。此外,编译器在优化代码时可能会进行指令重排序,这在一些情况下会导致程序运行行为不符合预期。声明为volatile的变量在赋值后会立即刷新到主内存,并且在读取前会从主内存中重新加载,这样可以防止指令重排序,确保程序执行的顺序符合预期。

场景

关于volatile关键字的使用场景,它适用于:

  • 多线程并发访问的共享变量,确保变量值的改变对所有线程立即可见。
  • 双重检查锁定模式中,声明单例实例为volatile,以保证线程安全。
  • 防止指令重排序,确保程序的正确执行顺序。
  • 线程间的通信,通过修改volatile变量来实现。

注意事项

需要注意的是,虽然volatile可以保证单个共享变量的读写操作的可见性,但它不能保证原子性。也就是说,它无法保证复合操作的原子性,因此如果需要保证某个操作的原子性,应当使用其他的同步机制,如synchronized关键字或原子类。


http://www.niftyadmin.cn/n/5427059.html

相关文章

Leetcode刷题笔记——动态规划(背包问题)篇

Leetcode刷题笔记——动态规划(背包问题)篇 一、0-1 背包问题 0-1背包问题简介 有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…

苹果电脑下载crossover对电脑有影响吗 crossover mac 好用吗CrossOver虚拟机 CrossOver打游戏

苹果电脑下载crossover对电脑有影响吗? 在苹果电脑下载安装crossover对电脑没有什么影响,并且可以解决macOS系统不能安装Windows应用程序的问题。相较于虚拟机和双系统而言,crossover安装软件更简单,占用内存也更小。下面我们来看…

Linux 开机启动Springboot程序

一、实现思路 1.编写启动Bash脚本、停止Bash脚本。 2.通过Linux注册服务,实现开机启动。 二、编写Bash脚本 1.启动脚本(重启适用) 创建/web/start.sh文件(文件位置可以自定义),写入内容: #!/bin/sh # jar包路径 …

Elastic boosting的使用

boosting介绍 Boosting查询允许您降低与负面查询匹配的文档的相关性评分 boosting语法 GET /_search {"query": {"boosting": {"positive": {"term": {"text": "apple"}},"negative": {"term&q…

【Leetcode】top 100 矩阵

73 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 方法一:拷贝出一个同样大小的矩阵,根据拷贝矩阵在原矩阵上修改元素; 空间复杂度O(mn) 方法二&…

【Emgu CV教程】9.4、形态学常用操作之闭运算

文章目录 一、相关概念1.什么叫闭运算2.闭运算的函数 二、演示1.原始素材2.代码3.运行结果 一、相关概念 1.什么叫闭运算 上一篇讲开运算,这一篇讲闭运算。与开运算相反,闭运算是先进行膨胀后进行腐蚀。回忆一下,膨胀有什么特点&#xff1f…

Python常用语法汇总(三):函数、类

9. 函数 #例1def greet_user(username): # 定义函数 """显示简单的问候语""" print(Hello, username.title() !) greet_user(Jesse) # 调用函数 #例2 def get_formatted_name(first_name,last_name): """返回整洁的姓名&q…