首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AtomicInteger源码分析详解

* * weakCompareAndSet"可能会失败 * 虚假并且不提供订购保证, 也是 * 很少是一个合适的替代品...* 该方法可能可能虚假的失败并且不会提供一个排序的保证,所以它在极少的情况下用于代替compareAndSet方法。...* 看源码的doc是这样子解释的: 该方法可能可能虚假的失败并且不会提供一个排序的保证,所以它在极少的情况下用于代替compareAndSet方法。...在一些平台上,在正常情况下weak版本比compareAndSet更高效,但是不同的是任何给定的weakCompareAndSet方法的调用都可能会返回一个虚假的失败( 无任何明显的原因 )。...( 一个虚假的失败可能是由于内存冲突的影响,而和预期值(expectedValue)和当前的值是否相等无关 )。

67450

Package java.util.concurrent.atomic Description

该包中的类还包含获取和无条件设置值的方法,以及下面描述的较弱条件原子更新操作weakCompareAndSet 。 这些方法的规范使实现能够采用当代处理器上可用的高效机器级原子指令。...类的实例AtomicBoolean , AtomicInteger , AtomicLong和AtomicReference各自提供访问和更新相应的类型的单个变量。...每个类还提供了适用于该类型的实用方法。 例如,类AtomicLong和AtomicInteger提供原子增量方法。...(这样的虚假故障可能是由于与预期值和当前值是否相等无关的内存争用效应)。另外, weakCompareAndSet不提供同步控制通常需要的排序保证。...在那些您不希望这样做的情况下,您可以使用AtomicInteger来保存byte值,并适当地投射。

47220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    对 volatile、compareAndSet、weakCompareAndSet 的一些思考

    该方法可能可能虚假的失败并且不会提供一个排序的保证,所以它在极少的情况下用于代替compareAndSet方法。 第一次看weakCompareAndSet doc文档的说明时,我是困惑的。...在一些平台上,在正常情况下weak版本比compareAndSet更高效,但是不同的是任何给定的weakCompareAndSet方法的调用都可能会返回一个虚假的失败( 无任何明显的原因 )。...( 一个虚假的失败可能是由于内存冲突的影响,而和预期值(expectedValue)和当前的值是否相等无关 )。...这二段话是什么意思了,也就是说weakCompareAndSet底层不会创建任何happen-before的保证,也就是不会对volatile字段操作的前后加入内存屏障。...,weakCompareAndSet方法并没有被真是意义上的实现,目前该方法所呈现出来的效果与compareAndSet方法是一样的。

    1.3K61

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。...AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。...AtomicInteger counter = new AtomicInteger(); int oldV = counter.get(); counter.set(10); 但该实现是错的,因为 counter.get...检查某条件是否成立 根据条件成功、失败执行不同操作 在业务代码中,这种操作一般用锁实现,但 AtomicInteger 原生提供的 compareAndSet 无锁完美解决....weakCompareAndSet 弱化版compareAndSet,可能会虚假地失败,并且不提供排序保证,因此,很少是compareAndSet的适当替代方法,JDK8源码中未曾使用过它,因为二者在

    35941

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。...AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 继承关系 ?...AtomicInteger 的初衷就是在不使用锁的前提下,实现原子的读-改-写操作,这是通过 Unsafe 类提供的 CAS 操作实现的,CAS 操作有底层 CPU 直接支持。...getAndSet 无脑更新 value ,并发场景下不会一直如此简单,有时要求 value 满足特定条件时才设置,这是非常典型的原子复合操作 检查某条件是否成立 根据条件成功、失败执行不同操作 在业务代码中...weakCompareAndSet 弱化版compareAndSet,可能会虚假地失败,并且不提供排序保证,因此,很少是compareAndSet的适当替代方法,JDK8源码中未曾使用过它,因为二者在

    45621

    atomicBoolean源码分析

    把对象序列化成字节码,保存到指定介质上(如磁盘等) 2....在一些平台上,在正常情况下weak版本比compareAndSet更高效, 但是不同的是任何给定的weakCompareAndSet方法的调用都可能会返回一个虚假的失败( 无任何明显的原因 )。...( 一个虚假的失败可能是由于内存冲突的影响,而和预期值(expectedValue)和当前的值是否相等无关 )。...当一个线程看到一个通过weakCompareAndSet修改的原子变量时,它不被要求看到其他变量的修改,即便该变量的修改在weakCompareAndSet操作之前。...weakCompareAndSet实现了一个变量原子的读操作和有条件的原子写操作,但是它不会创建任何happen-before排序, 所以该方法不提供对weakCompareAndSet操作的目标变量以外的变量的在之前或在之后的读或写操作的保证

    50420

    atomicLong源码分析详解

    把对象序列化成字节码,保存到指定介质上(如磁盘等) 2....失败的线程 不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS 操作即时没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。...在一些平台上,在正常情况下weak版本比compareAndSet更高效, 但是不同的是任何给定的weakCompareAndSet方法的调用都可能会返回一个虚假的失败( 无任何明显的原因 )。...( 一个虚假的失败可能是由于内存冲突的影响,而和预期值(expectedValue)和当前的值是否相等无关 )。...当一个线程看到一个通过weakCompareAndSet修改的原子变量时,它不被要求看到其他变量的修改,即便该变量的修改在weakCompareAndSet操作之前。

    56010

    告诉你一个 AtomicInteger 的惊天大秘密!

    CAS 方法 我们一直常说的 CAS 其实就是 CompareAndSet 方法,这个方法顾名思义,就是 「比较并更新」 的意思,当然这是字面理解,字面理解有点偏差,其实人家的意思是先比较,如果满足那么再进行更新...类型,如果是 true 就表示比较并更新成功,否则表示失败。...weakCompareAndSet: 妈的非常认真看了好几遍,发现 JDK1.8 的这个方法和 compareAndSet 方法完全一摸一样啊,坑我。。。 ? 但是真的是这样么?...CAS 能够保证原子性,它的底层是什么?...可以是由 A -> B -> A 的这种情况,但是 AtomicInteger 却不会这么认为,它只相信它看到的,它看到的是什么就是什么。举个例子来说 假如现在有一个单链表,如下图所示 ?

    42120

    AtomicInteger详解

    一、AtomicInteger 因为在阻塞队列中LinkedBlockingQueue中对容量的维护使用了Atomic类,所以需要对该类学习下,如何使用AtomicInteger来保证线程操作的原子性...实际上源码中可以看出AtomicInteger类中的操作的思想基本上是基于CAS+volatile。...(1)CAS操作失败后,会继续尝试更新变量,如果一直更新不成功,会一直自旋。在高并发的情况下,CPU压力会因此增加。...操作二:由于操作二和操作一存在并发行为,因此A-取出的内存原值仍为100,但是此时的V已经被更新成了50,B-新值50。V!=A,所以更新失败。...这种场景下,实际上用户认为自己的账户实际上应该为100元,但是由于ABA问题,导致在用户无感知,系统多次重复提交的情况下而多扣了50元。

    1K10

    为什么要有 AtomicReference ?

    value 就是 AtomicReference 中的实际值,因为有 volatile ,这个值实际上就是内存值。...语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。...,只能解析到这里了,如果大家懂这段代码一定告诉我,让我请教一波) weakCompareAndSet 方法 weakCompareAndSet: 妈的非常认真看了好几遍,发现 JDK1.8 的这个方法和...并不是,JDK 源码很博大精深,才不会设计一个重复的方法,你想想 JDK 团队也不是会犯这种低级团队,但是原因是什么呢? 《Java 高并发详解》这本书给出了我们一个答案。...此篇 AtomicReference 的文章基本上涵盖了网络上所有关于 AtomicReference 的内容了,遗憾的是就是 cpp 源码可能分析的不是很到位,这需要充足的 C/C++ 编程知识,如果有读者朋友们有最新的研究成果

    99730

    java架构之路(多线程)原子操作,Atomic与Unsafe魔术类

    这次不讲原理了,主要是一些应用方面的知识,和上几次的JUC并发编程的知识点更容易理解....CountDownLatch和CyclicBarrier都有让多个线程等待同步然后再开始下一步动作的意思,但是CountDownLatch的下一步的动作实施者是主线程,具有不可重复性;而CyclicBarrier...()); }else{ System.out.println("CAS修改失败,当前版本为:"+atomicInteger.getStamp...然后干扰线程进行修改,每次修改时版本号加一,干扰线程结束,而主线程想继续修改时,发现版本不匹配,修改失败。 ?   其余Atomic的类使用都是大同小异的,可以自行尝试一遍。   ...,都是一些简单的使用,我们开始时候说到了什么是原子操作,接下来我们说了Atomic类的基本使用,再就是什么是ABA问题,如何用Atomic来解决ABA问题,再就是我们的魔术类Unsafe类,越过虚拟机直接来操作我们的系统的一些操作

    46810
    领券