当前位置:首页 > Java入门 > 正文内容

经过两个月的不懈努力,没白费(经过两个月的不懈努力,疫情结束了怎么写)

abcsky887个月前 (10-30)Java入门96

本篇文章给大家谈谈

原标题:经过两个月的自查和未外包的创业公司,才发现真正不稳定的1.引入场景,问题出现很多同学去面试的时候,都会被问到一个常见的问题:说说你对volatile的理解?很多初学的同学可能会有点懵,因为之前可能没有注意过这个。

经过两个月的不懈努力,没白费(经过两个月的不懈努力,疫情结束了怎么写)

但是在网上百度一下,很多文章写的不错,但是理论太深了,文字太多,图片太少,有点看不懂基于以上痛点,本文尝试站在青年学生的角度,用最简单的白话,配上几张图,告诉大家什么是volatile?当然,本文不会深究理论,因为一下子说的太多了,很多同学还是难以理解。

这篇文章只是为了通俗易懂地解释一下volatile的事情,但是其中包含了一些具体的底层原理和技术问题,以后有seo查询是什么意思机会再写上来先给大家放一张图,一起来看看:如上图所示,这张图表明在Java内存模型中,每个线程都有自己的工作内存,同时也有共享的主内存。

例如,如果有两个线程的代码都需要读取一个数据变量的值,那么它们都将数据变量的值从主内存加载到自己的工作内存中,然后可以使用该值。

好了,现在从图中可以看出,每个线程都将变量数据的副本加载到自己的工作内存中,因此每个线程都可以读取值data=0这样,在线程的代码执行过程中,数据值可以直接从工作内存中加载,而不需要从主内存中加载那么问题来了,为什么每个线程都需要使用工作内存来存储变量的副本以供读取呢?难道不能让线程每次都从主存中加载变量值吗?

这很容易!因为线程执行的seo查询是什么意思代码对应着CPU执行的一些指令!但是CPU每执行一次指令操作,也就是执行我们写的大部分代码的时候,如果每次都需要这个变量的值,就会从主存中加载,性能会很差比较穷!所以后来想到了一个办法,就是线程有一个类似于快速本地缓存的工作内存概念。

这样,线程的代码在执行过程中可以直接从自己的本地缓存中加载变量的副本,而不用从主存中加载变量的值,性能可以得到很大的提升!但是想想,有什么问题呢?想象一下,如果线程1将某个数据变量的值更改为1,然后将此修改写入自己的本地工作内存。

在这种情况下,线程1的工作内存的数据值当前为1但是主存中数据的值还是0!线程2工作内存中的数据值还是0?!这就尴尬了,那么线程1代码执行seo查询是什么意思的时候,他可以直接读到数据最近的值为1,但是线程2代码执行的时候读到的数据的值还是0!

结果,线程1和线程2实际上都在处理变量的数据,但是当线程1更改数据变量的值时,线程2看不到它并且总是在其本地工作内存中看到旧变量一份价值!这就是Java并发编程中所谓的可见性问题:当多个线程同时读写一个共享变量时,有可能一个线程改变了变量的值,而其他线程却看不到!。

即对其他线程是不可见的!2.volatile的作用及其背后的原理如果我们想解决这个问题怎么办?这一刻,轮到挥发者登场了!你只需要在定义变量的时候把volatile数据加入到变量中,就可以直接彻底的解决这个可见性问题。

比如下面这段代码在volatilseo查询是什么意思einsert之后,有什么作用呢?整个操作我就不给大家解释了,因为我们的投资都是大白话如果我们在这里提出各种内存屏障和重排序指令的底层概念,很多同学又会一头雾水了!让我们在这里谈谈他的主要角色。

首先,当一个数据变量定义了volatile修饰符时,只要线程1改变了数据变量的值,它就会在其本地工作内存中强制改变数据变量的值后的最后一个数据变量值要更新主内存,必须立即将主内存中数据变量的值更改为最新值!。

整个过程可以在下图中看到:第二,如果其他线程的工作内存中当前有数据变量的本地缓存,即变量的副本,则其他线程工作内存中数据变量的缓存会被直接强制过期,可能不会再次阅读服用并使用!整个过程可以在下图中看seo查询是什么意思到:

第三,如果线程2在代码执行过程中需要再次读取data变量的值,此时如果尝试从本地工作内存读取,会发现data=0stale!此时,他需要从主存中加载数据变量的最新值!然后就可以读到最后一个数据值=1了!整个过程,请看下图:

答对了!那么,volatile完美的解决了Java并发中的可见性问题!一旦给一个变量加上了volatile关键字,只要一个线程改变了那个变量的值,它就会被强制立即闪回主存然后强制其他线程的本地工作内存缓存过期,最后当其他线程读取变量的值时,强制从主内存中重新加载最新的值!。

这确保如果任何线程更改变量的值,其他线程将立即看到它!这就是所谓的volatile保证能见度!三、总seo查询是什么意思结与提醒最后跟大家提一下,volatile的主要作用是保证可见性和有序性排序涉及到更复杂的概念,比如指令重排序,内存屏障,本文不涉及,但是volatile不能保证原子性!。

也就是说,volatile主要是解决了一个线程中改变一个变量的值后,其他线程可以立即读取到最新值的问题,解决了这个问题,即可见性!但是,如果多个线程同时修改一个变量的值,多线程并发仍然可能存在安全问题,导致数据值发生乱序变化。

volatile不负责解决这个问题,即不负责解决原子性问题!原子性问题必须用synchronized、ReentrantLock等锁机制来解决。

返回搜狐,查看更多责任编辑:

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/792.html

分享给朋友:

“经过两个月的不懈努力,没白费(经过两个月的不懈努力,疫情结束了怎么写)” 的相关文章

java到底是干什么的(java是做什么用的)

本篇文章给大家谈谈 学习Java可以做网站Java可以用来编写网站,现在很多大型网站都用JSP写的,JSP全名Java Server Pages它是一种动态网页技术,比如我们熟悉的163,一些政府网站都是采用JSP编写的所以学习Java的同学可以找开发网站方面的工作,而且现在找这方...

java培训费用大概多少(java 培训一般多少钱)

今天给各位分享 Java软件开发作为互联网行业发展最火爆的行业之一,备受年轻人的关注,Java开发的相关岗位不仅发展前景好,薪资待遇也是不错的,就业机会也很多所以,Java行业成为了大家转行进入互联网发展的第一选择,目前,想要转行的人中绝大多数都是零基础的,参加Java线下培训是这...

开发转测试开发怎么样(开发转测试有什么优势)

本篇文章给大家谈谈 一、为什么从开发转测试  笔者从2019年5月开始从一名java开发女程序猿正式转为测试开发工程师,原因除了机缘凑巧之外,当然是因为这个行业对测试工程师的要求已经越来越高,简单做些UI脚本录制和回放的自动化,参考度娘写出框架demo却不知道问题出在哪里的测试人员...

java类销毁方法(java被取代)

今天给各位分享 作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC。 编译Java语言的编译期其实是一段“不确定 ”的过程,因为可...

计算机科学与技术什么专业好找工作(计算机科学与技术什么专业好就业)

今天给各位分享 原标题:最火热的计算机科学与技术专业,适合你吗?计算机相关专业作为近年来最火热的专业,深受许多学子热捧,成为他们报志愿时的首选计算机相关专业究竟是什么?哪些高校实力强劲呢?接下来,让我们深入了解一下计算机相关专业。 什么是计算机科学与技术?计算机科学与技术是...

python为什么叫爬虫编程(python为啥叫爬虫)

本文分享给大家的是: 原标题:六星教育:爬虫为什么用Python而不是Java?在大数据时代,企业最大的资源就是数据借助数据分析掌握整个市场的态势,获得市场洞察力,变的相当关键数据抓取已经成为了企业运作的常态,而利用爬虫抓取数据更是最常用,最便捷的数据获取方式之一。 网络爬...