首页 > 其他分享 >volatile关键字的作用

volatile关键字的作用

时间:2023-06-28 15:33:42浏览次数:28  
标签:变量 synchronized ++ 关键字 线程 volatile CPU 作用

Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。volatile变量具备两种特性,volatile变量不会被缓存在寄存器或者对其他的处理不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

变量可见性:其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他的线程是可以立即获取的。

禁止重排序:volatile禁止了指令重排。比synchronized更轻量级的同步锁,在访问volatile变量时不会执行加锁操作,因此也就并不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字电更轻量级的同步机制。volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。

volatile关键字的作用_同步机制

当对非volatile变量进行读写的时候,每个线程先从拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的CPU cache中。而声明变量是volatile的,JVM保证了每次读变量都从内存中读,跳过CPU cache这一步。

使用场景

值得说明的是对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质i++是读、写两次操作。在某些场景下可以代替synchronized。但是,volatile的不能完全取代synchronized的位置,只有在一些特殊的场景下,才能适用volatile。总的来说,必须同时满足下面两个条件才能保证并发环境的线程安全:

1.对变量的的写操作不依赖于当前值(比如i++),或者说是单纯的变量赋值(boolean flag = true)。

2.该变量没有包含的在具有其他的变量的不变式中,也就是说,让不同的volatile变量之间,不能互相依赖。只有在状态真正独立于程序内其他内容时才能使用volatile。

标签:变量,synchronized,++,关键字,线程,volatile,CPU,作用
From: https://blog.51cto.com/u_11315052/6572545

相关文章

  • Git忽略部分修改的方法(.gitignore添加忽略文件不起作用的解决办法)
    背景:有时候本地修改,有些修改不需要提交上库,所以需要进行部分文件的修改进行忽略处理。 一、.gitignore方式忽略.gitignore文件中只能忽略本地新增的目录或者文件,这个文件默认会被提交上库,除非该文件添加了忽略自身。 二、.git/info/exclude方式忽略.git/info/exclude文件......
  • TypeScript又出新关键字了?
    TypeScript5.2将引入一个新的关键字:using。当它离开作用域时,你可以用Symbol.dispose函数来处置任何东西。{constgetResource=()=>{return{[Symbol.dispose]:()=>{console.log('Hooray!')}}}usingresource=getResource();......
  • 单继承、多继承下的属性查找、super关键字、多态与多态性、组合
    单继承下的属性查找单继承:一个类只能继承一个类。classC():passclassB(C):passclassA(B):#单继承pass单继承下的属性查找顺序:先从对象本身的名称空间中查找------>产生这个对象的类中去查找 ------>继承的父类中去查找#查找属性classFoo():......
  • Golang空结构体struct{}的作用?
    介绍在平时做项目得时候,经常会看到很多包里面定义了结构体。e.g.在context包里面Context接口中的Done()方法,Done()返回一个是以空结构体定义数据的通道chanstruct{},那这里他是有什么特殊用意吗?我们接下来分析struct{}的作用。struct{}空结构是没有字段的结构类型。下面看示......
  • SAP UI5 命名空间 com.sap.vocabularies.Common.v1 的作用
    SAPUI5是一种基于JavaScript的用户界面技术,用于构建企业级Web应用程序。它提供了一套丰富的控件库,可以帮助开发者轻松地创建响应式、跨平台的用户界面。命名空间是一种在编程中常见的概念,用于区分不同的代码库或功能模块,以避免命名冲突。com.sap.vocabularies.Common.v1是......
  • SAP UI5 应用里 /sap/ui/thirdparty/datajs.js 的作用
    SAPUI5是一个基于JavaScript的用户界面技术,用于构建企业级应用程序。它是一个成熟的开源框架,由SAP开发,致力于提供高质量、可扩展和易于维护的Web应用程序。SAPUI5应用程序使用一系列技术和库,其中之一就是/sap/ui/thirdparty/datajs.js。在本文中,我们将详细讨论datajs.......
  • SAP UI5 sap.ui.layout 命名空间的作用介绍
    SAPUI5是一种用于构建企业级Web应用程序的开发框架。它提供了丰富的UI控件和工具,使开发人员能够快速构建现代化、可扩展和可定制的应用程序。在SAPUI5中,sap.ui.layout是一个重要的命名空间,用于提供布局和容器相关的控件和功能。下面将详细介绍sap.ui.layout的作用和一些示例。......
  • JS(函数、作用域、预解析)
    一函数的概念在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用JS中的函数。函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量......
  • Oracle - MERGE关键字用法
    效果:查询两个结果集,根据其中一个,更新另一个。在ETL项目中,掌握这个语句,就能完成大部分的数据处理了。MERGEINTO(--目标结果集,需要更新的结果集SELECT*FROMA_EVT_NOTICE_SMYWHEREDATA_DT='20230101')TARUSING(--源结果集,更新依据的结果集SELE......
  • 08异步短信发送,注册功能,补充【1.为什么要写media才能访问,2.debug作用,3.ALLOWED_HOSTS
    1异步发送短信#原来的发送短信,是同步 -前端输入手机号---》点击发送短信---》前端发送ajax请求----》到咱们后端接口---》取出手机号----》调用腾讯发送短信---》腾讯去发短信---》发完后----》回复给我们后端发送成功---》我们后端收到发送成功---》给我们前端返回发送成功......