JUC包中的分而治之策略-为提高性能而生( 四 )
其中unsafe.getAndAddLong的代码如下:
可知最终调用的是native 方法compareAndSwapLong原子性操作 。
当多个线程调用同一个AtomicLong实例的incrementAndGet方法后 , 多个线程都会执行到unsafe.getAndAddLong方法 , 然后多个线程都会执行到代码(1)处获取计数器的值 , 然后都会去执行代码(2) , 如果多个线程同时执行了代码(2) , 由于CAS具有原子性 , 所以只有一个线程会更新成功 , 然后返回true从而退出循环 , 整个更新操作就OK了 。 其他线程则CAS失败返回false , 则循环一次在次从(1)处获取当前计数器的值 , 然后在尝试执行(2) , 这叫做CAS的自旋操作 , 本质是使用Cpu 资源换取使用锁带来的上下文切换等开销 。
2.2 LongAdder类
AtomicLong类为开发人员使用线程安全的计数器提供了方便 , 但是AtomicLong在高并发下存在一些问题 , 如上所述 , 当大量线程调用同一个AtomicLong的实例的方法时候 , 同时只有一个线程会CAS计数器的值成功 , 失败的线程则会原地占用cpu进行自旋转重试 , 这回造成大量线程白白浪费cpu原地自旋转 。
推荐阅读
- 热血传奇|热血传奇:当年心中的巅峰,随便一件无比骄傲
- 手办|原神:“肝帝”再现!玩家花30天自制胡桃手办,手中的护摩亮了
- edg战队|EDG夺冠可谓是小说中的梦幻剧情,先破RNG再废GEN.G,豪虐DK夺冠
- 亚运会|LOL入选亚运会正赛,你心中的阵容怎么选?
- 孙权|三国杀:背景帝!武将皮肤中的最强客串王,孙十万果然名不虚传
- 夏侯惇|王者荣耀之中的“最强坦克”, 夏侯惇和程咬金你更喜欢谁?
- 穿越火线|轻松上手,赶超雷神:盘点CF中那些神枪中的天之骄子
- 明日之后|消逝的光芒2设计师:明日之后打造了我心目中的人尸大决战
- 老玩家|天龙网游:天龙游戏中的神奇玩法,没有经历过别说自己是老玩家
- 魔兽世界|魔兽世界玩家未解之谜,王者荣耀中的死亡骑士,得到授权了吗?