JAVA并发-原子类/加法器(Adder)和累加器(Accumulator)

一、原子类基础

1. 什么是java原子类?

Java中的原子类-并发编程
参考URL: https://blog.csdn.net/balsamspear/article/details/86575173

原子类包装了一个变量,然后提供对这个变量的原子操作的方法。

注意:原子类中对变量的操作,都是原子操作。
JDK在1.5时提供了很多原子类,在java.util.concurrent.atomic包下。

2. demo测试,不使用原子类测试

/**
 * 这个例子很简单,起20个线程,每个线程执行1万次i++操作,预期结果应该是20万,实际结果却是7万多。
 * 原因是,虽然volatile保证了有序性和可见性,但是不能保证原子性,i++不是原子操作。
 */
public class AtomicTest {

    private static volatile int i;

    private static void increase() {
        i++;
    }

    public static void main(String[] args) throws Exception {
        Thread[] threads = new Thread[20];
        for (int k = 0; k < 20; k++) {
            threads[k] = new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    increase();
                }
            });
            threads[k].start();
        }

        for (Thread thread : threads) {
            while (thread.isAlive()) {
                Thread.sleep(100);
            }
        }
        System.out.println(i);
    }
}
  • 这个例子很简单,起20个线程,每个线程执行1万次i++操作,预期结果应该是20万,实际结果却是7万多。
  • 原因是,虽然volatile保证了有序性和可见性,但是不能保证原子性,i++不是原子操作。

2.1 i++是否原子操作?并解释为什么?

volatile为什么不能保证原子性
参考URL: https://blog.csdn.net/xdzhouxin/article/details/81236356

对于i++这样的操作,其实是分3步执行的,读取i的值,增加i的值,回写i的新值。这3步每一步都是原子操作,但是组合在一起就不一定是原子操作了。

3. 原子类使用场景

对于是需要简单的递增或者递减的需求场景,使用synchronized关键字和lock固然可以实现,但代码写的会略显冗余,且性能会有影响,此时用原子类更加方便。

3.1 原子类如何使用

上面介绍了原子类有4大类,这里以原子更新基本类型中的AtomicInteger类为例,介绍通用的API接口和使用方法。

首先是几个常用的API:

// 以原子方式将给定值与当前值相加,可用于线程中的计数使用,(返回更新的值)。
int addAndGet(int delta)

// 以原子方式将给定值与当前值相加,可用于线程中的计数使用,(返回以前的值)
int getAndAdd(int delta)

// 以原子方式将当前值加 1(返回更新的值)
int incrementAndGet()

// 以原子方式将当前值加 1(返回以前的值)
int getAndIncrement() 

// 以原子方式设置为给定值(返回旧值)
int getAndSet(int newValue)

// 以原子方式将当前值减 1(返回更新的值)
int decrementAndGet()// 以原子方式将当前值减 1(返回以前的值)
int getAndDecrement()

// 获取当前值
get()

二、加法器(Adder)和累加器(Accumulator)

加法器(Adder)和累加器(Accumulator):原子类型的扩充与优化,主要有:LongAdder、LongAccumulator、DoubleAdder和DoubleAccumulator,比AtomicLong和AtomicDouble性能更优。

1. java8中为什么要新增LongAdder?

大家对AtomicInteger的基本实现机制应该比较了解,它们是在一个死循环内,不断尝试修改目标值,知道修改成功,如果竞争不激烈,那么修改成功的概率就很高,否则,修改失败的概率就很高,在大量修改失败时,这些原子操作就会进行多次循环尝试,因此性能就会受到影响。

​ 在 JDK 8 中又新增了 LongAdder 这个类,这是一个针对 Long 类型的操作工具类。那么既然已经有了 AtomicLong,为何又要新增 LongAdder 这么一个类呢?

LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景。

经过试验,LongAdder 的吞吐量大约是 AtomicLong 的十倍,不过凡事总要付出代价,LongAdder 在保证高效的同时,也需要消耗更多的空间。

2. LongAdder

​ 在 JDK 8 中又新增了 LongAdder 这个类,这是一个针对 Long 类型的操作工具类。

2.1 LongAdder原理

死磕 java并发包之LongAdder源码分析
参考URL: https://zhuanlan.zhihu.com/p/65520633

LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder存储的值。

在这里插入图片描述

3. Accumulator

Accumulator 和 Adder 非常相似,实际上 Accumulator 就是一个更通用版本的 Adder,比如 LongAccumulator 是 LongAdder 的功能增强版,因为 LongAdder 的 API 只有对数值的加减,而 LongAccumulator 提供了自定义的函数操作。

三、参考

java fork-join框架应用和分析
参考URL: https://www.iteye.com/blog/shmilyaw-hotmail-com-1897636
Fork/Join框架(一)引言
参考URL: https://ifeve.com/fork-join-1/
Fork/Join框架基本使用
参考URL: https://blog.csdn.net/tyrroo/article/details/81390202
ForkJoin框架使用和原理剖析
参考URL: https://blog.csdn.net/codingtu/article/details/88729498

已标记关键词 清除标记
相关推荐
<p><strong><span style="color: #337fe5;">[JAVA工程师必会知识点之并发编程]</span></strong></p> <p style="font-size: 14px; background-color: #ffffff;"> </p> <p style="color: #008781;"> </p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"> </p> <p class="MsoNormal"><strong><span style="color: #000000;">1、现在几乎</span><span style="color: #000000;">100%</span><span style="color: #000000;">的公司面试都必须面试并发编程,尤其是互联网公司,对于并发编程的要求更高,并发编程能力已经成为职场敲门砖。</span></strong></p> <p class="MsoNormal"><strong><span style="color: #000000;">2</span><span style="color: #000000;">、现在已经是移动互联和大数据时代,对于应用程序的性能、处理能力、处理时效性要求更高了,传统的串行化编程无法充分利用现有的服务器性能。</span></strong></p> <p class="MsoNormal"><strong><span style="color: #000000;">3</span><span style="color: #000000;">、并发编程是几乎所有框架的底层基础,掌握好并发编程更有利于我们学习各种框架。想要让自己的程序执行、接口响应、批处理效率更高,必须使用并发编程。</span></strong></p> <p class="MsoNormal"><strong><span style="color: #000000;">4、并发编程是中高级程序员的标配,是拿高薪的必备条件。</span></strong></p> <p> </p> <p><span style="color: #337fe5;">【主讲讲师】</span></p> <p><span style="color: #337fe5;"><span style="color: #000000;">尹洪亮Kevin:</span><br /><span style="color: #000000;">现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。</span><br /><span style="color: #000000;">10余年软件行业经验,具有数百个线上项目实战经验。</span><br /><span style="color: #000000;">擅长JAVA技术栈、高并发高可用伸缩式微服务架构、DevOps。</span><br /><span style="color: #000000;">主导研发的蜂巢微服务架构已经成功支撑数百个微服务稳定运行</span><br /><br /></span></p> <p style="color: #008781;"><strong><span style="color: #337fe5;">【推荐你学习这门课的理由:</span><span style="color: #e53333;">知识体系完整+丰富学习资料】</span></strong></p> <p style="margin-left: 18pt; text-indent: -18pt; background: white;">1<span style="color: #000000;">、 本课程总计122课时,由五大体系组成,目的是让你一次性搞定并发编程。分别是并发编程基础、进阶、精通篇、Disruptor高并发框架、RateLimiter高并发访问限流吗,BAT员工也在学。</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">2、课程附带附带3个项目源码,几百个课程示例,5个高清PDF课件。</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">3、本课程0基础入门,从进程、线程、JVM开始讲起,每一个章节只专注于一个知识点,每个章节均有代码实例。</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;"> </span></p> <p style="color: #008781; background: white;"><span style="color: #337fe5;">【课程分为基础篇、进阶篇、高级篇】</span></p> <p style="color: #008781; background: white;"><span style="color: #337fe5;">一、基础篇<br /></span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">基础篇从进程与线程、内存、CPU时间片轮训讲起,包含线程的3种创建方法、可视化观察线程、join、sleep、yield、interrupt,Synchronized、重入锁、对象锁、锁、wait、notify、线程上下文切换、守护线程、阻塞式安全队列等内容。</span></p> <p style="color: #008781; background: white;"><span style="color: #337fe5;">二、进阶篇</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">进阶篇课程涵盖volatied关键字、Actomic、可见性、原子性、ThreadLocal、Unsafe底层、同步容器、并发容器、5种并发队列、COW容器、InheritableThreadLocal源码解析等内容。</span></p> <p style="color: #008781; background: white;"><span style="color: #337fe5;">三、精通篇</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">精通篇课程涵盖JUC下的核心工具,CountDownLath、CyclicBarrier、Phaser、Semaphore、Exchanger、ReentrantLock、ReentrantReadWriteLock、StampedLock、LockSupport、AQS底层、悲观锁、乐观锁、自旋锁、公平锁、非公平锁、排它锁、共享锁、重入锁、线程池、CachedThreadPool、FixedThreadPool、ScheduledThreadPool、SingleThreadExecutor、自定义线程池、ThreadFactory、线程池切面编程、线程池动态管理等内容,高并发设计模式,Future模式、Master Worker模式、CompletionService、ForkJoin等</span></p> <p style="color: #008781; background: white;"><span style="color: #337fe5;">课程中还包含</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">Disruptor高并发无锁框架讲解:Disruptor支持每秒600万订单处理的恐怖能力。深入到底层原理和开发模式,让你又懂又会用。</span></p> <p style="color: #008781; background: white;"><span style="color: #000000;">高并发访问限流讲解:涵盖木桶算法、令牌桶算法、Google RateLimiter限流开发、Apache JMeter压力测试实战。</span></p> <p> </p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"><strong><span style="color: #337fe5;">【学完后我将达到什么水平?】</span></strong></p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"><span style="color: #000000; font-family: ";">1、 吊打一切并发编程相关的笔试题、面试题。</span></p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"><span style="color: #000000; font-family: ";">2、 重构自己并发编程的体系知识,不再谈并发色变。</span></p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"><span style="color: #000000; font-family: ";">3、 精准掌握</span><span style="color: #000000; font-family: ";">JAVA</span><span style="color: #000000; font-family: ";">各种并发工具、方法、关键字的原理和使用。</span></p> <p class="ql-long-24357476" style="color: #222226; font-family: "font-size:14px; background-color: #ffffff;"><span style="color: #000000; font-family: ";">4、 轻松上手写出更高效、更优雅的并发程序,在工作中能够提出更多的解决方案。</span></p> <p class="MsoNoSpacing" style="margin-left: 18pt; text-indent: -18pt;"><span style="color: #000000;"> </span></p> <p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt;"> </p> <p> </p> <p class="ql-long-24357476" style="color: #008781;"> </p> <p class="MsoListParagraph" style="color: #008781; margin-left: 36pt; text-indent: -36pt;" align="left"><strong><span style="color: #337fe5;">【</span><span style="color: #337fe5;">面向人群</span><span style="color: #337fe5;">】</span></strong></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 36pt; text-indent: -36pt;" align="left"><span style="color: #000000;">1、 总感觉并发编程很难、很复杂、不敢学习的人群。</span></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 36pt; text-indent: -36pt;" align="left"><span style="color: #000000;">2、 准备跳槽、找工作、拿高薪的程序员。</span></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 36pt; text-indent: -36pt;" align="left"><span style="color: #000000;">3、 希望提高自己的编程能力,开发出更高效、性能更强劲系统的人群。</span></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 36pt; text-indent: -36pt;" align="left"><span style="color: #000000;">4、 想要快速、系统化、精准掌握并发编程的人群。</span></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 18pt; text-indent: -18pt;"><strong>【课程知识体系图】</strong></p> <p class="MsoListParagraph" style="color: #008781; margin-left: 18pt; text-indent: -18pt;"><img src="https://img-bss.csdnimg.cn/202007100721287398.png" alt="" /></p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值