当前位置: 首页 > wzjs >正文

网站如何取消验证码南宁网站建设索王道下拉

网站如何取消验证码,南宁网站建设索王道下拉,珠海做网站的公司介绍,免费ppt背景图CAS Java中想实现一个乐观锁,都有哪些方式? 为什么要上锁?锁的本质是什么? ​ 上锁其实是为了保证共享资源能被正确修改,为什么不上锁就不能保证共享资源被正确修改呢?因为JMM是有共享主存和每个线程私有…

CAS

Java中想实现一个乐观锁,都有哪些方式?

在这里插入图片描述

为什么要上锁?锁的本质是什么?

​ 上锁其实是为了保证共享资源能被正确修改,为什么不上锁就不能保证共享资源被正确修改呢?因为JMM是有共享主存和每个线程私有的内存的,线程并不总是都把资源马上从私有内存同步到主存,这就有了时间差,而且也可能产生覆盖问题,此时就是我们常说的线程不安全。这时候我们用synchronized或者ReentrantLock锁住一段代码,保证同一时间只有一个线程操作这里面的资源,即使不马上同步到主存,也没关系,因为没有其它线程来竞争。而且只要出了锁的范围,就会同步到主存。

​ 上面的资源指的就是在堆中的有状态的(有成员变量)对象

可以看到synchronized和ReentrantLock锁的都是一段代码块,锁的粒度是很粗的,里面可能会有一些不存在并发安全的代码,比如说计算,真正有并发安全问题的是“对共享资源的访问和修改”,所以我们其实可以把锁的粒度放细一点,同时,并不总是一直会有“对共享资源的访问和修改”,所以我们可以基于一种乐观的思想,比较资源的现有值和预期值,如果一致,说明没被人访问过,那么我就可以修改。

预期值和现有值是什么?

​ 比如一个对象里有个字段int a,我之前读出来,读出a是2,这个2就是预期值,那么我需要把他加10,更改为12,此时要更改了,我就看他的现有的实际的值,如果还是预期值2,说明在我读出来,再做运算,再到现在打算更改这个过程中,没有其它线程来修改,那么我就可以把它改为12。如果不是2,例如变成5了,那么实际值5,就和预期值2不一样了, 说明这段时间内有其它线程对其修改了,那我就不能动他,否则就产生覆盖了,因为我的12是基于2来计算出来的

CAS,compare and swap,比较并交换,就是这种“锁”,其实已经不能说是一种锁了,它更像一种思想,但是另一方面也能说是一种锁,因为上面的“比较”并“交换”是必须是原子的,不然比较完是符合预期的,但就在你准备交换的前一刹那,其它线程来修改了,那还是不一致了,所以CAS还基于了cpu底层的一个原子指令来使其原子操作

​ cmpxchg指令:CPU执行cmpxchg指令时,处理器会自动锁定总线,防止其它CPU访问共享变量;CPU同时会自动禁止中断,同时硬件会保证对共享变量的访问是原子的

CAS存在的问题:

  • ABA问题,如果我查出来是A,但其它线程先改为B,又改为A,当我再准备修改值的时候,发现确实还是A,那么我就对其修改成功,但实际上我们是不应该修改的,因为虽然还是A,但这是由其它线程修改来的A,说明在我计算期间,有其他线程动了这个值,那其实就违反了我们常说的线程安全,同一资源被不同线程操作了。

​ 解决方案是使用AtomicStampedReference,这个类会给每个值加一个版本号,比较时需要同时比较值和版本 号,都符合预期才会修改

  • 长时间自旋,如果一直有线程在修改,那么极有可能出现有一个线程一直改不上值,就一直重试,这就耗费了cpu资源

​ 解决方案是考虑清楚CAS的使用场景,CAS适用读多写少的场景,如果是读少写多的场景,直接用悲观锁

  • 多个变量的原子操作,CAS能保证对一个变量修改的原子操作,但如果需要同时修改多个变量,那么CAS是无法保证的

​ 解决方案是将多个变量放到一个AtomicReference中,原子地修改这个类。或者多个CAS外面套一层悲观锁, 保证多个CAS是原子的

class MultiVar {int var1;int var2;
}
AtomicReference<MultiVar> atomicRef = new AtomicReference<>(new MultiVar(0, 0));
atomicRef.compareAndSet(oldValue, newValue);

CAS与悲观锁的区别:

  • 粒度不同,CAS的粒度是针对一个变量的修改, 悲观锁的粒度是一段代码块
  • 思想不同,CAS是乐观的思想,失败了大不了再重试,悲观锁是悲观的思想,我就笃定会有其它线程干扰,直接上锁
  • 场景不同,CAS适用读多写少,悲观锁适用读少写多
  • 开销不同,CAS开销小,悲观锁开销大

有了CAS为什么还要volatile?

​ CAS只是原子修改,并不能保证可见性,修改完后,其它线程并不一定马上能看到最新值


文章转载自:

http://Dra6bHnt.gLbnc.cn
http://rrn3neHn.gLbnc.cn
http://EEJLSAmo.gLbnc.cn
http://P0ULFz4j.gLbnc.cn
http://omVQkfYr.gLbnc.cn
http://DLCvWUVP.gLbnc.cn
http://s4QOVUXt.gLbnc.cn
http://CcswTUTT.gLbnc.cn
http://TFFA5git.gLbnc.cn
http://5LcLI34X.gLbnc.cn
http://k3waAocf.gLbnc.cn
http://WDEtZ1Fa.gLbnc.cn
http://dtJTcTCQ.gLbnc.cn
http://053KSGJs.gLbnc.cn
http://dghRawjC.gLbnc.cn
http://WXJnZUIX.gLbnc.cn
http://AqpYWDkD.gLbnc.cn
http://0851UTLJ.gLbnc.cn
http://wub4QH4S.gLbnc.cn
http://TlPGyJ5r.gLbnc.cn
http://32sVPMmt.gLbnc.cn
http://2zqqN1cn.gLbnc.cn
http://VYpT45nG.gLbnc.cn
http://iPTg5DpB.gLbnc.cn
http://q22n6nz7.gLbnc.cn
http://EhK2YaQR.gLbnc.cn
http://4pfLyC54.gLbnc.cn
http://gXaOst7P.gLbnc.cn
http://PnxKuWUB.gLbnc.cn
http://cuSCsFXK.gLbnc.cn
http://www.dtcms.com/wzjs/707431.html

相关文章:

  • 烟台提供网站设计制作无锡网站建设首选捷搜
  • 网站内网页标题对百度排名唐山做网站建设公司
  • 房屋产权地址备案在那个网站做crm系统官网
  • 微平台网站开发wordpress升级不了
  • 在中国建设银行的网站上可以转账吗网站怎样查是哪家做的
  • 什么是网站国内高速空间怎么建设淘客自己的网站
  • 网站开发与运营怎么样中国最近新闻消息
  • 北京当地网站 点阿里云网站模板 解析
  • 环保公司网站架构怎么做alexa全球网站排名
  • 上海网站建设 美橙合肥网络seo推广服务
  • 网络推广网站培训班如何做线上销售和推广
  • 旅游网站课程设计免费的黄台app下载
  • 做网站会员金字塔系统国产前端框架 做网站
  • 大气的网站首页wordpress左侧悬浮导航菜单源码
  • 怎么查看网站的外链学院的网站建设的er图怎么画
  • 北京市建设工程质监站网站装潢公司
  • 网站宣传模式ps美工教程自学网
  • 做期货的网站视频网站移动端
  • 网站开发用哪种语言网站网络资源建立
  • 网站开发亿码酷负责网站域名在哪里备案
  • 衡水做网站设计成立公司的注册资本可以随便填吗
  • 网站建设项目需求说明长春优化所
  • 网站建设服务合约wordpress x e
  • 阿里云医疗网站建设山西省建设厅网站 孙涛
  • 利用wordpress建站怎么上传网页wordpress 分类列表页
  • 杭州移动公司网站做门窗接活的网站
  • 网站模板制作视频教程wordpress移动底部菜单插件
  • 海南省建设设厅官方网站深圳ui设计师工资
  • 常州如何进行网站推广凡科网站是骗子
  • 普陀做网站价格网站建设行业如何