订阅博客
收藏博客
微博分享
QQ空间分享

苹果的功效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日

频道:淘宝彩票app下载安装 标签:徐子姗纨绔子弟 时间:2019年05月04日 浏览:189次 评论:0条

难度

初级

学习时刻

30分钟

合适人群

零根底

开发言语

Java

开发环境

  • JDK v11
  • IntelliJIDEA v2018.3

友谊提示

  • 本教育归于系列教育,内容具有连贯性,本章运用到的内容之前教育中都有具体解说。
  • 本章内容针对零根底或根底较差的同学比较友爱,或许关于有根底的同学来说很简略,期望咱们能够依据自己的实际情况挑选继续看完或等候看下一篇文章。谢谢咱们的体谅!

1.温故知新

前面在《“全栈2019”Java原子操作第三章:比较并沟通CAS技能详解》一章中介绍了什么是比较并沟通CAS苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日技能

《“全栈2019”Java原子操作第四章:AtomicBoolean介绍与运用》一章中介绍了什么是原子操作类AtomicBoolean

《“全栈2019”Java原子操作第五章:AtomicInteger介绍与运用》一章中介绍了什么是原子操作类AtomicInt段培相eger

《“全栈2019”Java原子操作第六章:AtomicInteger灵敏的运算办法》一章中介绍了运用原子操作类AtomicInteger的办法完成更灵敏的运算办法

《“全栈2019”Java原子操作第七章:AtomicLong介绍与运用》一章中介绍了什么是原子操作类AtomicLong

现在介绍原子操作类AtomicReference

2.什么是原子操作类?

望文生义,原子操作类便是完成了原子操作苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日的类。

原子操作的概念和必备常识在该系列的《“全栈2019”Java原子操作榜首章:内存可见性volatile关键字解析》《“全栈2019”Java原子操作第二章:i++是原子操作吗?何为原子性》以及《“全栈2019”Java原子操作第三章:比较并沟通CAS技能详解》三章中现已具体介绍过了,这儿就不再赘述。不清楚的小伙伴请前去查阅相关章节。

2.AtomicReference简介

关于学过该系列的榜首、二、三章的小伙伴来说,原子操作类就显得简略许多,并且里边的原理现已把握得差不多了,所以本章就简略来介绍一下原子操作类之一:AtomicReference

AtomicReference是一个以原子方苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日式操作目标引证的类。

AtomicReference带有“”,指的是AtomicReferenc苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日e带泛型,能够指定目标类型。

先简略来看一下AtomicReference类长什么样:

AtomicReference类很简略,它有两个结构办法:

如下:

  • AtomicReference()
  • AtomicReference​(V initialValue)

这两个结构办法都比较常用。

第二个结构办法AtomicReference​(V initialValue)能够指定初始值。

下面咱们就来用一用AtomicReference

3.AtomicRefere缺钾的症状nce运用场景

AtomicReference运用也比较广泛,只要是目标操作是原子的,都能够运用到AtomicReference

例如,咱们之前提到的计数器,那时用的是AtomicInteger,没有用Integer,那是由于Integer不带原子操作。现在能够用Integer了,由于只需将Integer与AtomicReference结合即可,这样咱们以原子的办法更新Integer目标,也就不存在并发问题了。

假如咱们有更多关于AtomicReference的运用场景请在谈论区留金度完言,谢谢。

下面,来看看未运用AtomicReference的时分会是怎样。

比如是大局计数器。

首苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日先,咱们创立一个大局计数器类:

然后,将其结构办法进行私有化,意图是不让创立目标,只能运用其静态办法:

接着,界说一个Integer类型的变量记载当时生成的计数器:

然后,界说一个办法来获取当时计数器的值:

接着,再界说一个办法来递加计数器的值:

大局计数器类写好了。

接下来,咱们去试试大局计数器。

在Main类中创立一个计数使命:

接着,在run办法里边调用大局计数器目标的递加办法:

run()办法书写结束。

然后,咱们创立100个线程去履行计数使命:

最终,等这100个线程都履行完计数使命使命今后,咱们再次获取计数器的当时值:

假如当时计数器的值是100,则阐明每个线程都有自己仅有的计数,都是不同的;

假如当时计数器的值不是100,则阐明有计数相同的线程,大局计数器这个类就有问题。

不过在此之前需求睡1秒钟,意图是等这100个线程履行结束之后咱们再获取当时计数器山小桔的值:

比如书写结束。

运转程序,履行成果:

从运转成果来看,不契合预期。当时计数不为100,阐明大局计数器这个类是有问题的。

怎样处理?

这时咱们的AtomicReference类派上用场了。

咱们只需用AtomicReference替换Integer类型即kink可:

由于AtomicReference替换Integer,所以获取当时计数千禧年器的值的办法和递加当时计数器的值的办法都得改动。

先是获取当时计数器的值的办法:

然后是递加当时计数器的值的办法:

关于学过前面几章的小伙伴来说,get()办法和getAndU花沫和本兮相片软件管家pdate(UnaryOperator updatescoreFunction)办法不生疏,get()办法是用来获取value的当时值;getAnd周弋楠Update(UnaryOperator updateFunction)办法是用来更新value目标当时值的,咱们能够自界说更新办法。

注:getAndUpdate(UnaryOperator updateFunction)办法在下面末节会有具体解说。

比如改写结束。

运转程序,履行成果:

从运转成果来看,契合预期。当时计数为100,大局计数器这个类的问题得到了处理。

当然了,除了给Java现已存在的目标赋予原子性,咱们还能够给自界说目标赋予原子性。

下面,咱们就来一个自界说目标Person:

然后,在Person类中界说两个特点,名字和年纪:

接着,咱们给Person类添加一个有参结构办法,并且还要保存无参结构办法:

最终,给Person类中的name和age特点供给getter/setter办法:

自界说目标写好了。

下面就用AtomicReference与Person类来说说AtomicReference类里边几个常用办法及源码。

关于学过《“全栈2019”Java原子操作第五章:AtomicInteger介绍与运用》《“全栈2019”Java原子操作第七章:AtomicLong介绍与运用》两章的小伙伴来说,把握下面的内容垂手可得,由于改变的仅仅是将int、long类型变为目标类型。

注:由于下面内容在之前章节中讲过太屡次,所以此次内容会得到精简,以便阅览。

4.获取当时值get()办法

get()办法的作用是获取目标的当时值;

比如:

运转程序,履行成果:

从运转成果来看,契合预期。

5.设置新值set​(V newValue)办法

set​(V newValue)办法的作用是设置目标的当时值。参数newValue是咱们能够指定的新值。

比如:

运转程序,履行成果:

从运转成果来看,契合预期。

6.回来更新前的值getAndUpdate(UnaryOperator updateFunction)办法

getAndUpdate(UnaryOperator updateFunction)办法的作用是回来更新前的值。

比如:

运转程序,履行成果苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日:

从运转成果来看,契合预期。即便在getAndUpdate(UnaryOperator updateFunction)办法中设置了新值,但办规律回来的是更新前的值。

7.回来更新后的值updateAndGet(UnaryOperator updateFunction)办法

updateAndGet(UnaryOperator updateFunction)办法的作用是回来更新后的值。

比如:

运转程序,履行成果:

从运转成果来看,契合预期。咱们在updateAndGet(UnaryOperator updateFunction)办法中设置了新值,办法即时回来了新值。

8.回来自界说运算办法更新前的值getAndAccumulate(V x, BinaryOperator accumulatorFunction)办法

getAn花螺的做法dAccumulate(V x, BinaryOperator accumulatorFunction)办法的作用是回来自界说运算办法更新前的值。

比如:

运转程序,履行成果:

从运转成果来看,契合预期。原值为“Tom:18”,然后咱们在getAndAccumulate(V x, BinaryOperator accu郭珍霓mulatorFunction)办法中设置了新值“Jack:23”,办法回来了更新前的值“Tom:18”。

9.回来自界说运算办法更新后的值accumulateAndGet(V x, BinaryOperator accumulatorFu百威啤酒nction)办法

accumulateAndGet(V x, BinaryOperator accumulatorFunc唐三彩tion)办法的作用是回来自界说运算办法更新前的值。

比如:

运转程序,履行成果:

从运转成果来看,契合预期。原值为“Tom:18”,然后咱们在accumulateAndGet(V x, BinaryOperator accumulatorFunction)办法中设置了新值“Jack:23”,办法回来了更新后的值“Jack:2凤阳天气预报3”。

10.CAS算法表现

咱们之前在《“全栈2019”Java原子操作第三章:比较并沟通CAS技能详解》一章中学习过什么是CAS算法。

在AtomicReference类中也有表现:

compareAndSet(V expectedValue, V newValue)办法的作用是当value==expectedValue时,就将newValue赋给value,不然什么也不做。

比如:

运转程序,履行成果:

从运转成果来苹果的成效,“全栈2019”Java原子操作第八章:AtomicReference简略介绍,夸父追日看,契合预期。

当然了,你也能够将预期值改为一个非原值的数,这样赋值就不成功。

最终,期望咱们能够把这个比如照着写一遍,然后再自己默写一遍,便利今后碰到相似的面试题能够轻松应对。

祝咱们编码愉快!

GitHub

本章程序微乐GitHub地址:https://github.com/gorhaf/Java2019/tree/master/Thread/atomic/AtomicReference

总结

  • AtomicReference是一个以原子办法操作目标的类。
  • get()办法的作用是获取目标的当时值;
  • set​(V newValue)办法的作用是设置目标的当时值。参数newValue是咱们能够指定的新值。
  • getAndUpdate(UnaryOperator updateFunction)办法的作用是回来更新前的值。
  • updateAndGet(UnaryOperator updateFunction)办法的作用是回来更新后的值。
  • getAndAccumulate(V艾滋病潜伏期 x, BinaryOperator accumulatorFunction)办法的作用是回来自界说运算办法更新前的曾秀梅值。
  • accumulateAndGet(V x, BinaryOperator accumulatorFunction)办法的作用是回来自界说运算办法更新前的值。
  • compareAndSet(V expectedValue, V newValue)办法的作用是当value==expectedValue时,就将newValue赋给value,不然什么也不做。

至此,Java中AtomicReference相关内容解说先告一段落,更多内容请继续重视。

答疑

假如咱们有问题或想了解更多前沿技能,请在下方留言或谈论,我会为咱们回答。

上一章

“全栈2019”Java原子操作第七章:AtomicLong介绍与运用

下一章

“全栈2019”Java原子操作第九章:atomic包下原子数组介绍与运用继承法

学习小组

参加同步学习小组,一起沟通与前进。

  • 办法一:重视头条号Gorhaf,私信“Java学习小组”。
  • 办法二:重视大众号Gorhaf,回复“Java学习小组”。

全栈工程师学习方案

重视咱们,参加“全栈工程师学习方案”。

版权声明

原创不易,未经答应不得转载!