学习
实践
活动
专区
工具
TVP
写文章
  • 广告
    关闭

    【玩转 GPU】有奖征文

    精美礼品等你拿!

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

    AtomicInteger源码解析

    AtomicInteger的实现原理 AtomicInteger采用基于CAS进行数据的原子性操作的Unsafe工具类,Unsafe类通过在对象实例化的时候记录数据的地址,并通过比较获取的原有数据与新获取数据是否一致来确定数据是否被其他线程修改 而对于数据的可见性,AtomicInteger采用volatile关键字进行修饰,使得线程对数据的操作均作用于主存,从而保证数据在多线程之间的可见性。AtomicInteger的初始化如下所示。 valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value") private volatile int value; AtomicInteger提供的主要接口 AtomicInteger提供基本的数据操作,对于复杂的数据操作,其提供了lambda 表达式进行支持 以下是AtomicInteger提供的主要接口。

    21330

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 继承关系 ? AtomicInteger 的初衷就是在不使用锁的前提下,实现原子的读-改-写操作,这是通过 Unsafe 类提供的 CAS 操作实现的,CAS 操作有底层 CPU 直接支持。 构造方法 AtomicInteger 提供两个构造函数 用给定值初始化 AtomicInteger ? 无参构造,初始值为 0 ? 注意,该类所有方法都被 final 修饰,子类无法重写! counter = new AtomicInteger(); int oldV = counter.get(); counter.set(10); 但该实现是错的,因为 counter.get() 与

    30621

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 字段,而 value 有 volatile 修饰. valueOffset 在静态代码块中完成初始化: [5088755_1583756733927_20200309190526874.png] AtomicInteger 构造方法 AtomicInteger 提供两个构造函数 用给定值初始化 AtomicInteger [5088755_1583756733906_20200309190902563.png] 无参构造, counter = new AtomicInteger(); int oldV = counter.get(); counter.set(10); 但该实现是错的,因为 counter.get() 与

    22541

    AtomicInteger、AtomicBoolean、AtomicLong等原子类的使用

    下面我们看一下具有原子操作的类AtomicInteger、AtomicBoolean、AtomicLong。这三个类的的方法使用都是一样的,我们重点看一下AtomicInteger类的使用。 get()的作用是获取当前AtomicInteger类中的值。然后将获取的AtomicInteger类中的值执行加1运算。 最重要的就是这个compareAndSet方法,我们知道这个方法的作用是将AtomicInteger类中的值与预期值做比较,如果相等,那就把AtomicInteger类中的值设置为方法参数的值,并且这个方法也是原子操作 说明get()方法获取的值不是最新的了,也就是说有其它线程已经对AtomicInteger类中的值与做了修改了,那么方法就会一直执行循环,然后继续判断,一直到compareAndSet方法返回ture时为止

    59730

    多线程 里面 使用AtomicInteger类,保证线程安全

    3 解决 AtomicInteger出现解决了上面的问题,使用它来执行统计: static AtomicInteger at = new AtomicInteger(0); public static InterruptedException e) { e.printStackTrace(); } System.out.println("count = " + at.get()); } AtomicInteger 4 总结 AtomicInteger能够实现整型数据的原子操作,在多线程并发的环境下能保证数据安全,而且内部使用乐观锁实现,比使用锁机制的并发性能高; volatile保证了一个线程修改数据时,其它线程也能看到数据的修改 CAS操作保证了数据修改的安全性 5 线程统计失败个数 多个线程执行一段逻辑,统计有多少个线程失败了 ConcurrentMap<Integer, AtomicInteger> jobTimeoutCountMap timeoutCount = jobTimeoutCountMap.putIfAbsent(22, new AtomicInteger(1)); if

    30220

    一直使用AtomicInteger?试一试FiledUpdater

    这个问题非常简单,哪怕是Java的初学者都能回答上来,使用AtomicXXX,比如有一个int类型的自加,那么你可以使用AtomicInteger 代替int类型进行自加。 AtomicInteger atomicInteger = new AtomicInteger(); atomicInteger.addAndGet(1); 如上面的代码所示,使用addAndGet 我们首先来看看AtomicInteger类: public class AtomicInteger extends Number implements java.io.Serializable { 成员变量只有一个int value,似乎好像并没有多出内存,但是我们的AtomicInteger是一个对象,一个对象的正确计算应该是 对象头 + 数据大小,在64位机器上AtomicInteger对象占用内存如下 由于我们的AtomicInteger是一个对象,还需要被引用,那么真实的占用为: 关闭指针压缩:24 + 8 = 32 开启指针压缩: 16 + 4 = 20 而fieldUpdater是staic final

    49220

    扫码关注腾讯云开发者

    领取腾讯云代金券