范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

java的原子类到底是啥?ABA,CAS又是些什么?

  1)解决并发不是用锁就能解决吗,那SDK干嘛还要搞个原子类出来?  锁虽然能解决,但是加锁解锁始终还是对性能是有影响的,并且使用不当可能会造成死锁之类的问题。
  2)原子类是怎样使用的,比如说我要实现一个线程安全的累加器?   public class Test {    AtomicLong count =       new AtomicLong(0); // 原子类变量count    void add10K() {      int idx = 0;      while(idx++ < 10000) {        count.getAndIncrement();// 原子操作      }    }  }
  3)原子类是无锁的,那他底层是靠什么来实现原子安全的?  靠硬件。我们的CPU为了解决并发问题,提供了CAS指令,而CPU的指令本身就是原子性的。
  4)什么是CAS呢?  compare and swap ,他主要就看3个参数,A是共享变量的内存地址,B是用于和原地址值比较的,C是我们要更新的值。  其实就是把原来的共享变量的值取出一份来,然后你要更新的话,得对比一下,当前的值和我取出来保存的这份值是不是相同的,如果是相同的,那就可以修改,不同的话说明被别人修改过了,那你现在就不能更新。     class   SimulatedCAS{  int    count  ;  synchronized    int   cas(  int   expect,  int   newValue){  // 读目前count的值    int   curValue =  count  ;  // 比较目前count值是否==期望值    if  (curValue == expect){  // 如果是,则更新count的值    count   = newValue; }  // 返回写入前的值    return   curValue; } }
  5)假如我当前的值和我取出来的那份值不一样了,那该怎么办?  CAS一般带有自旋,所谓自旋也就是循环的意思。当值不同了 ,那就从头来进行:取值来放着--->对比--->相同的话那就更新,不同就从头再来。       class   SimulatedCAS{  volatile    int    count  ;  // 实现count+=1   addOne(){  do   { newValue =  count  + 1  ;  //①   } while  ( count   != cas( count  ,newValue)  //②   }  // 模拟实现CAS,仅用来帮助理解    synchronized    int   cas(  int   expect,  int   newValue){  // 读目前count的值    int   curValue =  count  ;  // 比较目前count值是否==期望值    if  (curValue == expect){  // 如果是,则更新count的值    count  = newValue; }  // 返回写入前的值    return   curValue; } } 从上面代码我们也可以看出来,完全是没有加锁解锁的操作的,所以CAS这种无锁实现并发的操作性能很好。
  6)我们说凡事都有两面性,CAS他就没任何的缺点吗?  会存在ABA问题,比如之前我取出来了一份值是A,但是在我进行对比之前,其它线程悄悄滴过来 ,把我的共享变量修改为了B,然后又修改成了A。虽然看到的都是A,其实这是被修改过的了。
  7)两个数值反正都是相同的,不影响我的更新,那我还在乎ABA干嘛?  如果我们只是进行数值的原子递增之类的操作,那我们是不需要关心的。但是如果是对象呢,对象就比数值讲究多了,可能 A表面都是 一样的,但是属性是不一样的。
  8)怎样解决ABA问题呢?  在使用 CAS 方案的时候,一定要先 check 一下。
  9)前面我们使用原子类 AtomicLong 的 getAndIncrement() 方法替代了count += 1,从而实现了线程安全。原子类 AtomicLong 的 getAndIncrement() 方法内部就是基于 CAS 实现的,那 Java 是如何使用 CAS 来实现原子化的count += 1的?  Java 1.8 版本中,getAndIncrement() 方法会转调 unsafe.getAndAddLong() 方法。这里 this 和 valueOffset 两个参数可以唯一确定共享变量的内存地址。  final   long getAndIncrement() {  return   unsafe.getAndAddLong(  this  , valueOffset,  1  L); }
  10)unsafe.getAndAddLong() 方法的底层源码实现是怎样的?  该方法首先会在内存中读取共享变量的值  之后循环调用 compareAndSwapLong() 方法来尝试设置共享变量的值,直到成功为止。  compareAndSwapLong() 是一个 native 方法,只有当内存中共享变量的值等于 expected 时,才会将共享变量的值更新为 x,并且返回 true;否则返回 fasle。       public    final    long    getAndAddLong  ( Object o,  long   offset,  long   delta){  long   v; do {  // 读取内存中的值   v = getLongVolatile(o, offset); }  while   (!compareAndSwapLong( o, offset, v, v + delta));  return   v; }  //原子性地将变量更新为x    //条件是内存中的值等于expected    //更新成功则返回true    native    boolean    compareAndSwapLong  ( Object o,  long   offset,  long   expected,  long   x);
  11)SDK中提供了哪些原子类给我们使用?
  使用提示:Java 提供的原子类能够解决一些简单的原子性问题,但是我们所有原子类的方法都是针对一个共享变量的,如果你需要解决多个变量的原子性问题,建议还是使用互斥锁方案。原子类虽好,但使用要非常小心。  如果你觉得这篇文章对你有帮助 点赞关注,然后私信回复【888】即可免费获取Java进阶全套视频以及源码学习资料

假如大象早已灭绝,科学家通过化石复原的大象会是什么模样?综述从地球诞生一直演变至今,出现了无数种形象各异的生物,而有些生物会因为环境的突变而惨遭灭绝,幸运的是,我们可以通过现代科技对它们的化石进行模拟和复刻,从而得到它们原本的样貌。例如雷军发力了,小米爆款比双十一便宜,1亿120W卖2199元声明原创不易,禁止搬运,违者必究!现在的消费者在购买手机的时候,大多是在线上购买,不难发现,手机厂商们也对线上布局更加注重。虽说线下体验感是线上所不具备的,但是线上的一些优势确实线平板电脑该怎么选择?我想买一款平板电脑,但又不知道如何下手?这个时候怎么办。首先要了解的是平板电脑的特性。平板电脑也叫便携式电脑,是一种小型方便携带的个人电脑,以触摸屏作为基本的输入设备。它拥有的触摸秀色可餐的国产真无线,音质续航皆出色,杰科GIECCandyPods上手这两年我基本每天都会使用真无线蓝牙耳机,得益于国产品牌的不断努力,现在一两百的价位上就能找到很多音质出色的小耳机,不过很多国产耳机也有一些缺点,最明显的就是设计,它们的耳机大多喜欢新品体验小米智能猫眼1S,到底做了哪些提升?智能家居第一步就是做家庭安防,当室内安装上摄像头,门外情况怎么看呢?大家就考虑智能猫眼智能门铃等产品,今天小编给大家小米智能猫眼升级品小米智能猫眼1S,跟上一代产品,到底有哪些提升小白如何远程控制电脑?贝锐向日葵开机插座C2计电量版了解一下想必大家都在不少电影上,看过黑客或者电脑高手远程控制电脑的桥段,是不是觉得很厉害的样子?其实远程控制并没有想象中那么复杂,借助一些智能硬件,我们普通人也能轻松实现远程控制电脑。说到泰坦军团32C1UF表现如何?销量方面说明一切,它真的有潜力今天我看到了一个性价比方面非常霸道的屏幕,那就是泰坦军团32C1UF,我们来说一些比较基本的信息,他的尺寸在31。5英寸,采用了曲面工艺。分辨率方面达到了4K超高清的水准,采用了H健康养生人睡三觉,命比纸薄!这三种觉太伤人睡觉可谓是日常生活中的头等大事,睡眠质量的好坏,对健康也有着重大影响。俗话常说人睡三觉,命比纸薄。到底是哪三觉呢?中医教你睡好觉随着春季的到来,天气越来越暖和,有些人出现了春困的现春季养生知识春困就像是传染病一样打扰着每个人,因此对自身健康的养生工作应该做到位。春季养生应遵循养阳防风的原则。春季,人体阳气顺应自然,向上向外疏发,因此要注意保卫体内的阳气,凡有损阳气的情况你喝啤酒吗?每天喝多少啤酒不影响健康?每天喝多少啤酒不影响健康?俄罗斯营养学家叶莲娜索洛玛季娜,在接受莫斯科晚报采访时说明了每天对健康无害的啤酒摄入量。索洛玛季娜称,每天可以喝300毫升啤酒,也可以辅以优质的营养丰富的起夜频繁夜尿增多,是肾不好?医生或是这5种因素导致正常人晚上起夜小便不超过两次,晚上总是起夜,小便次数多,应当属于夜间尿频,又称夜尿症。夜尿病症分为生理性原因,病理性原因如泌尿系感染,泌尿系结石及前列腺增生等。1生理性生理性可能是
抹不去的记忆知青的狗网络配图与文无关抹不去的记忆知青的狗作者悠然见南山来源北京知青论坛邻村的男生养了一条狗,小小的,纯黑的,我不喜欢。原因有三第一,这是男生养的,那时特分男女界限,说不出为什么,始终对安徽这景区以雄关险隘著称,百步云梯风景媲美黄山,一路奇松相伴旅行,是一种心情,一次发现,一段回忆,分享我在安徽遇见的夏日风景,作为一名喜欢登山的旅行者,游历过不少祖国的名山,三山五岳十大名山也走过一多半,不过有一座山虽不在这些名山之列,却给俄罗斯财政出现危机,国库就要见底,越打越有钱,原来是个笑话?俄罗斯8月份的财政报告出炉,有三个关键信息值得关注第一,俄联邦财政收入连续第二个月出现同比下降,8月同比下降11第二,俄联邦预算连续第三个月出现赤字,连续三个月赤字的结果,导致俄罗五矿稀土改个名字就涨停,深股通专用席位买卖都排第一记者赵阳戈五矿稀土(000831。SZ)一份简简单单的变更名称的公告,将市场的热情点燃了。据9月21日公告,公司董事会审议通过变更公司名称及简称的相关议案,公司拟将名称由原五矿稀土本溪投资100余万元建设太子河生态湿地公园来源辽宁日报初秋时节,在本溪市明山区鹭鸣太子河生态湿地公园里,紫色的鼠尾草千屈菜,还有百日花矢车菊孔雀草在大地上镶嵌出一条条色彩缤纷的彩带构成了占地约12万平方米的花海。鹭鸣太子河从台州湾新区的围涂公园说椒江路桥黄岩人民的围涂历史从台州湾新区的围涂公园说椒江路桥黄岩人民的围涂历史8月27日从仙居骑行回来后都一直忙着,没有机会能出去好好骑骑。至9月7日,有一个可以不用考虑做事的空闲时间,于是就出发骑行了。我从泸州这三座白塔,各有自己的名字,你知道是哪三座吗?头条创作挑战赛一路耍VOL032期文字王木木图片王木木众所周知,佛教源于印度塔,也是源于印度,最初是佛教为保存舍利而修建的建筑物。在我国,塔是从佛教传入开始出现的一种新的建筑类型。男孩起名最能体现腹有诗书气自华的好名字,魅力无限大家常说腹有诗书气自华,最是书香能致远,即多读书的人,会带有一股儒雅的气质,这种气质不会离开,会环绕在侧,可显现出不俗的涵养,可提升吸引力。父母若是想要自己的孩子成为这样的人,可从三焦不畅,浊气难降,一个方子打通三焦,让你气机顺畅,百病无踪大家好,我是赵医生,三焦不畅,则精气不升,浊气不降,今天分享一个方子,打通三焦,让气机畅顺,百病无踪。生活中经常有人感觉头晕头疼,神疲乏力,身上困重疼痛,哪里都不舒服,又是胸闷又是张仲景名方附子理中丸,不仅能温中健脾,还可以治这5种病大家好,我是屈医生,你知道吗?温中散寒健脾的附子理中丸还能治这5种病,今天屈医生就告诉你。附子理中丸出自医圣张仲景,是他留给后世的一个温中散寒健脾的经典名方,方由简单的5味药组成,六味地黄丸的7种配伍,功效不同,不可乱用,医生来告诉你六味地黄丸是我们日常生活中很常见的中成药。配伍是熟地山茱萸山药为三味补药,泽泻茯苓丹皮为三味泻药,特点是三补三泻,以补为主。六味地黄丸只有一种,但是以它为基础方的常用加减方,有7种