推广

Java中CAS原理分析(volatile和synchronized浅析)

iseeyu2年前 (2024-02-22)推广130

保证i++原子性

你一定会有一个疑,被 volatile 修饰的变量i,i++为什么会有线程安全问题呢,也就是原子性的问题,我们还是举一个经典的i++案例一步步分析吧!我们知道在多线程情况下volatile保证了共享变量的可见性,顺序行,但唯独不能保证原子性,原因是i++是一个复合操作,大致可以分成3步,1.先从主内存拿到最新的i值,2.将i加1这个操作保存到操作数栈,3.从栈中取出i加1的值写回到主内存。OK,当线程AB同时执行i++操作时,比如线程A先获取时间片,执行完第2步,这是线程A还未执行完,时间片分配给线程B,B顺利执行完所有操作后并同步了主内存,假设我们i的初始值是1,那么此时主内存值是2,因为线程B执行完毕,cpu时间片又回到线程A手上,做第3步操作,此时同步到主内存的值还是2,看,线程A,B各做了一次加1的操作,但最终结果可能是2,cas的作用就来了,他能保证i++操作的原子性,为什么能保证原子性呢?cas可以把上面三个操作合并成一个操作,是原子的。

有什么好处?

大家都知道解决多线程安全需要用到锁的,可以用 synchronized 来解决,但是synchronized也有它的劣势,最主要是它是阻塞的,阻塞会有什么问题?性能啊,这是计算机人不能忍的,频繁内核外核切换,会严重浪费系统资源,所以就提了cas这个乐观锁概念,它是非阻塞的,操作系统不用在内核态与用户态来回切换,相当于用while循环方式获取锁,在性能上有一定提升。即使这样,也会有一定问题,下面我们来看看。

有什么问题?

1.ABA问题。

这个案例比较简单,线程A把共享变量i,从1变成2,再变成1,线程B想把i变成2,本来应该是不会成功,因为即时变量i现在是1,但是它的状态变化了,他的解决方案是版本号。相当于修改成功一次版本号增加1,就可以解决了,曾经被面试官问到一个问题,cas是线程安全的吗?答案不是线程安全的。

2.自旋时间过长。

如果一个线程拿到锁后,一直不释放,其他线程就只能一直循环等待。

3.只能保证一个共享变量的原子性。

像Automic包下面的基本上都只能保证一个变量的原子性。

JUC包下面使用!

可能有些童鞋看JDK源码会比较纠结一个点, 发现volatile关键字一般都会和cas连用,如果不要volatile会怎么样呢 ?cas本身只作用于方法,cas对共享变量没有约束,如果不对共享变量做volatile修饰,是不可见的,不能够保证共享变量的实效性,需要等待共享变量主动同步到主内存,这是需要花时间的,效率更低下,所有在JUC并发包里一直可以看到这样的 volatile关键字一般都会和cas 组合。

总结

这篇文章,我们先引出了cas概念,并且说明了它的优缺点,做了案例介绍,简单的和synchronized关键字做了比较,最后,深入的说明了 volatile关键字 和 cas连用的效率, 这是我在深入思考后得到的结论,分享给大家。

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

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56124.html

相关文章

两大核心主业受市场拖累,东方财富一季度扣非净利同比仅增长5.34% 增速创近4年新低

每经记者:王海慜 每经编辑:何剑岭图片来源:摄图网_300281075今日收盘后,东方财富发布的2022年一季报显示,第一季度公司实现营收31.96亿元,同比增加10.61%;净利润21.71亿元,同比增加13.63%;扣非净利润20亿元,同比增长5.34%,增速创下201...

SEO优化时应该遵循的黄金准则。

SEO优化时应该遵循的黄金准则。

当然你有。gov的布景,那你在起点上会更高一点。而关于英文网站在域名中体现关键词,被证明没有任何作用。服务器程序选择安稳的服务器及程序是全部的基石。出名的空间商及老到的网站系统是第一选择。不要仅仅看空间或服务器的价格,产品的质量及工作人员的操行仍是有很大不同的。 至于选择多大的空间...

企业SEO如何提升网站索引量。

企业SEO如何提升网站索引量。

做网站SEO的都听说过索引量,那么索引量到底是什么意思呢?相信很多人一知半解,其实简单来说索引量就是搜索引擎认为你网站中对用户有用的页面数量。所以索引量的多少可以直接反应网站的质量,索引量越多也就更利于网站的排名。今天就来跟大家分享一下如何提升网站的索引量? 一、网站内容写作 想要提高索引量...

产品化拉新怎么做?撬动老用户去拉新用户啊!

产品化拉新怎么做?撬动老用户去拉新用户啊!

到底什么是产品化拉新呢?应该怎么做?这一年,跌跌撞撞中,反复迭代,各种尝试,少不了和同事之间讨论交流。前几天有个同事问我,觉得产品化拉新核心是什么。跟她聊完后,我需要梳理一下了。 一、产品化拉新定义和机制 产品化拉新,目的是为了新客数量,核心是用户增长。但是手段是产品化,也就是和市场化...

网站收录的问题。

网站收录的问题。

只要网站上线,那么百度搜索引擎的蜘蛛是肯定会访问你的网站的,但是在评级抓取网站的时候,是不可能把你网站所有网页挨着全访问一遍的,更加不可能对所有网站都赋予权重。结合以上两点,我们会核对各个搜索引擎中有多少收录的网页,而这就是索引纳入。 这些就是没有被收录的原因: 1,蜘蛛的访问是需要你的...

一张图告诉你,盐、油、水、奶每天给宝宝喂多少合适

对于新手爸妈来说,如何喂养宝宝是个难题。油盐水奶这些,宝宝每个年龄段要吃多少?不少家长就一脸懵了,哪怕在文章里零零散散地看过,也是转眼就忘啊!膳食指南里也会给出一些建议,但是,像3g盐、10g油,这样的描述总是让人有点摸不着头脑,毕竟平时做饭的时候也不会每一步都用秤来量一下...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片