volatitle-线程并发-小白一文速通

news2024/11/15 12:29:06

目录

简而言之

专业术语解释

1、可见性

原理简介

原理图解

其他方式

2、原子性

原理简介

结合实例分析

3、有序性

原理简介

线程安全问题

Volatile效果

1、保证可见性

2、保证有序性

3、无法保证原子性

Volatile底层的实现机制(重点掌握)

经典案例

Java双重检验锁的单例模式


简而言之

volatile修饰的共享变量特性:

  • 保证多线程对该变量操作的内存可见性
  • 禁止指令重排序

专业术语解释

1、可见性

原理简介

Java虚拟机(JVM)定义Java内存模型(JMM)来保证JAVA程序在所有平台具有相同内存访问效果

Java内存模型(JMM)规定所有变量存在主存中,各线程只能通过各自的工作内存访问、获取

出现问题:多线程执行i++时,可能线程A获取i为1,线程B获取i为2,因为缓存不一致!!!

当用volatile修饰,各线程对它修改会立刻刷新到主存,各线程都能读取到最新数据,即可见性

原理图解

其他方式

  • synchronized
  • Lock

线程释放锁之前,会将共享变量值(被上面两个修饰的变量)刷新到主存


2、原子性

原理简介

基本数据类型的读取和赋值操作 不可中断 ,要么不执行,要么执行完

结合实例分析

i = 2;
j = i;
i++;
i = i + 1;

i = 2 ,为原子性操作。属于基本数据类型int型赋值语句

j = i 不符合原子性。分为读取 i 的值和为 j 赋值两步 

i++和i = i+1 等效,都不符合原子性。分为三步,先读取 i 的值,再加1,最后 i 值写回主存


3、有序性

原理简介

Java内存模型(JMM)允许编译器和处理器在不影响程序执行结果前提下可以重排序语句

var pi = 3.14    //A
var r = 1        //B
var s= pi*r*r    //C

比如正常从上至下原则是 A->B->C

编译后可以是 B->A->C,因为AB相互不依赖

但是C不可以倒反天罡在AB二者之前执行

线程安全问题

var a = 0
var flag = false

fun write() {
    a = 2;             
    flag = true     
}

fun multiply() {
    if (flag) {        
       val ret:int = a * a
    }
    
}

解读:这里线程1执行write方法,write方法两个指令重排序了,线程2执行multiply方法。

由于重排序,write没执行完,先执行了Flag语句,结果线程2开始执行,运行结果也错误

此时可以为共享变量flag加volatile修饰,禁止重排序!!!


Volatile效果

var a = 0
volatile var flag = false

fun write() {
    a = 2;             
    flag = true     
}

fun multiply() {
    if (flag) {        
       val ret:int = a * a
    }    
}

假设线程1调用write(),线程2调用multiply()由于flag在两个方法都有依赖,属于共享变量

1、保证可见性

当一个变量被声明为 volatile 时,

线程在每次使用变量的时候都会直接从主内存中读取,而不是从自己的工作内存中读取;=。

volatile确保在线程1中flag值更新立刻刷新主存,线程2也从主存随时读取最新flag

2、保证有序性

通过一种同步机制——内存屏障,阻止屏障两侧指令被重排序,确保变量的读写顺序按照代码逻辑顺序,维持多线程环境中操作的有序性。

3、无法保证原子性

只是对单个volatile变量的读/写具有原子性

但是,volatile 关键字的复合操作(如自增、自减等操作)无原子性。

在多线程环境中,i++,i--无原子性

import kotlin.concurrent.thread  
  
class VolatileExample {  
    @Volatile  
    private var count = 0  
  
    fun increment() {  
        count++ // 这个操作在Kotlin中也不是原子性的  
    }  
  
    fun getCount(): Int {  
        return count  
    }  
  
    companion object {  
        @JvmStatic  
        fun main(args: Array<String>) {  
            val example = VolatileExample()  
            val t1 = thread {  
                repeat(1000) {  
                    example.increment()  
                }  
            }  
  
            val t2 = thread {  
                repeat(1000) {  
                    example.increment()  
                }  
            }  
  
            t1.join()  
            t2.join()  
  
            println("Final count is: ${example.getCount()}")  
        }  
    }  
}

Volatile底层的实现机制(重点掌握)

  • 生成汇编代码后,加入的volatile关键字会多出lock前缀
  • lock相当于内存屏障
  • 屏障作用是重排序是,阻止后面指令重排序到屏障之前

经典案例

Java双重检验锁的单例模式

class Singleton{
    private volatile static Singleton instance = null;
    
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null)
                    instance = new Singleton();
                    
            }
        }
        return instance;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

朗致面试----Java开发、Java架构师

一共三轮面试。第一轮是逻辑行测&#xff0c;第二轮是技术面试&#xff08;面试官-刘老师&#xff09;&#xff0c;第三轮是CTO面试&#xff08;面试官-屠老师&#xff09;。第三轮Coding做完之后共享屏幕讲一个你自己负责过的项目&#xff08;请提前准备好架构图&#xff0c;开…

【AI趋势8】具身智能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经从概念走向实际应用&#xff0c;深刻影响着我们的生产和生活方式。在众多AI技术载体中&#xff0c;人型机器人凭借其独特的类人形态和全身自由度&#xff0c;成为人工智能领域的终极载体之一。本文将深入…

系列:水果甜度个人手持设备检测-产品规划汇总与小结

系列:水果甜度个人手持设备检测 -- 产品规划汇总与小结 背景 接上一篇&#xff0c;我们从假设的用户需求出发&#xff0c;规划输出软硬件结合的一体化产品。在产品中搭载近红外光谱&#xff08;NIR&#xff09;、超声检测的模块&#xff0c;并针对不同的瓜果类型&#xff0c…

【开源分享】CommLite 跨平台文本UI串口调试助手

文章目录 1. 简介2. 编译3. 使用4. 借鉴&思考参考 1. 简介 CommLite是一款基于CSerialPort的文本UI串口调试助手。 gitee仓库 2. 编译 编译非常简单&#xff0c;按照文档操作即可&#xff1a; $ git clone --depth1 https://github.com/itas109/CommLite.git $ cd Comm…

数据结构----AVL树

小编会一直更新数据结构相关方面的知识&#xff0c;使用的语言是Java&#xff0c;但是其中的逻辑和思路并不影响&#xff0c;如果感兴趣可以关注合集。 希望大家看完之后可以自己去手敲实现一遍&#xff0c;同时在最后我也列出一些基本和经典的题目&#xff0c;可以尝试做一下。…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

Java二十三种设计模式-访问者模式(21/23)

本文深入探讨了访问者模式&#xff0c;一种允许向对象结构添加新操作而不修改其本身的设计模式&#xff0c;涵盖了其定义、组成部分、实现方式、使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案。 访问者模式&#xff1a;为对象结构添加新的操作 引言 …

黑神话:悟空-配置推荐

显卡推荐&#xff08;按类别整理&#xff09; 1. GTX 10系列、GTX 16系列&#xff1a; 如果希望体验光线追踪&#xff0c;建议根据预算升级到RTX 40系列显卡。对于1080p分辨率&#xff0c;至少需要RTX 4060才能流畅运行。 2. RTX 20系列&#xff1a; RTX 2060、RTX 2070&#…

Openboxes 移动终端APP项目开发环境搭建与调试

文章目录 前言项目简介APP开发环境搭建APP开发环境启动及调试主应用程序启动及调试结语 前言 openboxes 项目还有一个针对移动端的项目&#xff1a;openboxes-mobile&#xff0c;但是这个项目的默认分支&#xff08;develop&#xff09;并没有与openboxes的默认分支对应&#…

LabVIEW优化内存使用

在LabVIEW中&#xff0c;优化内存使用的关键在于理解LabVIEW的内存管理机制并采用一些最佳实践。以下是一些可能帮助减少内存占用的方法&#xff1a; 1. 减少数据副本的生成 避免不必要的数据复制&#xff1a;每当你在程序中传递数组或子数组时&#xff0c;LabVIEW可能会创建副…

充电宝哪些品牌的性价比是最高的?开学最推荐入手四款充电宝

随着新学期的到来&#xff0c;学生们对充电宝的需求愈发迫切。无论是在校园内上课、图书馆自习&#xff0c;还是在外出游玩时&#xff0c;充电宝都成为了我们必不可少的随身装备。然而&#xff0c;市场上充斥着各种品牌和型号&#xff0c;如何选择一款性价比高的充电宝&#xf…

React+Vis.js(04):设置节点显示图片

文章目录 实现效果关键代码完整代码设置图片边框和背景颜色我们继续以 复仇者联盟为例,来介绍如何实现节点显示 图片。 实现效果 以图片进行节点的显示,使得显示效果更加直观,信息更为明了。 关键代码 在vis.js中,通过属性shape来控制节点显示为图像。 const nodes …

linux | 苹果OpenCL(提高应用软件如游戏、娱乐以及科研和医疗软件的运行速度和响应)

点击上方"蓝字"关注我们 01、引言 >>> OpenCL 1.0 于 2008 年 11 月发布。 OpenCL 是为个人电脑、服务器、移动设备以及嵌入式设备的多核系统提供并行编程开发的底层 API。OpenCL 的编程语言类似于 C 语言。其可以用于包含 CPU、GPU 以及来自主流制造商如 …

关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(二)

文章目录 前提动态减少代码解读 动态增加线程池退出时发生了什么&#xff1f;总结附录 前提 我们在关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(一)中介绍了DynamicThreadPond如何初始化&#xff0c;如何向任务队列中添加任务&#xff0c;线程池中的线程如何执行任…

机器学习——第十二章 计算学习理论

目录 12.1 基础知识 12.2 PAC学习 12.3 有限假设空间 12.3.1 可分情形 12.3.2 不可分情形 12.4 VC维 12.5 Rademacher复杂度 12.6 稳定性 12.1 基础知识 计算学习理论(computational learning theory)研究的是关于通过"计算"来进行"学习"的理论…

SAP无参考收货

其他收货 如果我们未参考其他凭证&#xff08;采购订单、生产订单或预留&#xff09;输入货物移动&#xff0c;则我们将讲到其他收货。因为在实际过帐之前&#xff0c;系统不会存储任何物料、数量、交货日期、接收工厂或来源方面的信息&#xff0c;所以此类收货属于计划外货物…

一文入门re 正则表达式

一、常用方法 &#xff08;一&#xff09;匹配 一般使用方法 第一个参数&#xff1a;正则模式 第二个参数&#xff1a;需要处理的字符串 第三个参数&#xff1a;附加处理方法result从任意位置开始匹配&#xff0c;返回match&#xff0c;没有匹配到返回None result re.searc…

MiniCPM-V: A GPT-4V Level MLLM on Your Phone论文阅读

大模型的趋势&#xff1a;模型性能越来越好&#xff0c;模型参数变小&#xff0c;端边设备计算能力变强。 MiniCPM-V优点 结果好、OCR能力突出、多分辨率、多语言、易于部署 模型结构 图片encoder适用vit。输入整体以及切片。切片使用自适应算法&#xff0c;通过计算分数&am…

揭秘图数据库:如何颠覆社交网络分析的游戏规则

在当今信息化时代&#xff0c;社交网络的数据量以指数级的速度增长&#xff0c;人们在社交网络中产生了海量的交互数据。如何从这些复杂的数据中提取有价值的信息&#xff0c;成为了数据科学和社交网络分析领域的一大挑战。图数据库作为一种有效的数据管理和分析工具&#xff0…

Anzo Capital视角下马丁格尔交易策略的利与弊

在Anzo Capital&#xff0c;我们深入探讨了马丁格尔交易策略的多面性。这种策略因其简单性而受到一些交易者的欢迎&#xff0c;但同时也存在着不可忽视的风险。本文将客观分析其优势和潜在缺陷&#xff0c;帮助投资者在Anzo Capital平台上做出更明智的决策。 马丁格尔策略的核…