AtomicLong与LongAdder的区别】的更多相关文章

AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能. 缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差. 不少框架里面使用到了LongAdder这个类,而并非A…
AtomicLong的原理 AtomicLong是通过依靠底层的CAS来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder的原理 LongAdder是在AtomicLong的基础上将单点更新压力分散到各个节点,在低并发的时候通过对八色的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能.缺点就是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差. Lon…
AtomicLong简要介绍 AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作.在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性.而使用AtomicLong能让long的操作保持原子型. At…
AtomicLong简要介绍 AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作. 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性.而使用AtomicLong能让long的操作保持原子型. A…
如果让你实现一个计数器,有点经验的同学可以很快的想到使用AtomicInteger或者AtomicLong进行简单的封装. 因为计数器操作涉及到内存的可见性和线程之间的竞争,而Atomic***的实现完美的屏蔽了这些技术细节,我们只需要执行相应的方法,就能实现对应的业务需求. Atomic**虽然好用,不过这些的操作在并发量很大的情况下,性能问题也会被相应的放大.我们可以先看下其中getAndIncrement的实现代码 public final long getAndIncrement() {…
jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码: package com.itbac.cas; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; // 测试用例: 同时运行2秒,检查谁的次数最多 public class LongAdderDemo { // synchroni…
AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作. AtomicLong的代码很简单,下面仅以incrementAndGet()为例,对AtomicLong的原理进行说明.incrementAndGet()源码如下: public final long increm…
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入源码分析. 提出问题:int线程安全吗? 看过Synchronized相关文章的小伙伴应该知道其是不安全的,再次用代码应验下其不安全性: public class testInt { static int number = 0; public static void main(String[] ar…
这是why的第 53 篇原创文章 荒腔走板 大家好,我是why. 时间过的真是快,一周又要结束了.那么,你比上周更博学了吗?先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面这图是我之前拼的一副拼图,一共划分了800块,背面无提示,难度极高,我花了两周的时间才拼完. 拼的是坛城,传说中佛祖居住生活的地方. 第一次知道这个名词是 2015 年,窝在寝室看纪录片<第三极>. 其中有一个片段讲的就是僧人为了某个节日用沙绘画坛城,他们的那种专注,虔诚,真挚深深的打动了我,当宏伟的坛城画完之后,…
一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安全性 1)线程安全性的三个方面 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作. 可见性:一个线程对主内存的修改可以及时的被其它线程观察到. 有序性:一个线程观察其它线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序. 更多理解:并发编程之原子性.可见性.有序性的简单理…
线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体现: 1.原子性: 互斥访问,同一个时刻只有一个线程进行操作 2.可见性: 一个线程对变量的修改可以及时被其他线程看到 3.有序性: 一个线程观察其它线程中的指令执行顺序,由于指令重排序的操作该观察结果一般是无序的 原子性 1.CAS: 就是指compareAndSwap/compareAndSet…
文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2.2 volatile与Java内存模型(JMM) 2.3 线程组 2.4 守护线程(Daemon) 2.5 线程安全的概念和synchronized 第三章 JDK 并发包 3.1 同步控制 3.1.1 可重入锁(ReentrantLock) 1.锁申请等待超时 2.公平锁 3.1.2 条件(con…
本节我们先会来复习一下java.util.concurrent下面的一些并发容器,然后再会来简单看一下各种同步器. ConcurrentHashMap和ConcurrentSkipListMap的性能 首先,我们来测试一下ConcurrentHashMap和ConcurrentSkipListMap的性能. 前者对应的非并发版本是HashMap,后者是跳表实现,Map按照Key顺序排序(当然也可以提供一个Comparator进行排序). 在这个例子里,我们不是简单的测试Map读写Key的性能,而…
Q1:为什么非常高的并发请求下AtomicLong的性能会有很大影响?有没有什么更好的替代方案? 虽然AtomicLong使用CAS但是CAS失败后还是通过无限循环的自旋锁不断尝试的,在高并发下N多线程同时去操作一个变量会造成大量线程CAS失败然后处于自旋状态,这大大浪费了CPU资源,降低了并发性. JDK8提供的LongAdder.该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作.…
在本地与远程分别新建了一个仓库并且关联后,想要把本地的文件提交到github上面, 输入下方命令后没有成功,而是出现了报错:error: src refspec master does not match any git push -u origin master 原因,此时提交所在的分支是一个空目录,没有任何内容所以无法完成提交,所以应该先将待提交的内容添加到仓库并且提交以后再推到远程仓库,即 git add . git commit -m "XXX" git push -u ori…
一.线程安全性定义 定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全性主要体现在三个方面:原子性.可见性.有序性: 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作 可见性:一个线程对主内存的修改可以及时地被其他线程观察到 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序 使用示例: 1.Ato…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.线程安全性-原子性-atomic-1 1.线程安全性 定义: 当某个线程访问某个类时,不管运行时环境采用何种调度方式或者这些锦城南将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 特点: 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作 可见性:一个线程对主内存的修改可以及时的被其他线程观察到 有序性:一个线程观察其他…
先了解什么是线程安全性:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程安全的. 线程安全性主要体现在三个方面: 1.原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作 2.可见性:一个线程对主内存的修改可以及时的被其他线程观察到 3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令 重排序的存在,该观察结果一般杂乱无序 原子性-Atomic包:他们都是…
Java 多线程:锁(二) 作者:Grey 原文地址: 博客园:Java 多线程:锁(二) CSDN:Java 多线程:锁(二) AtomicLong VS LongAddr VS Synchronized 需要实际测试一下. 示例代码见: package git.snippets.juc; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; /** * 对比Ad…
前言 只有光头才能变强 之前已经写过多线程相关的文章了,有兴趣的同学可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thread.md 在阅读<阿里巴巴 Java开发手册>读后感时,还有未解决的问题: 如果是count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1);如果是 JDK8,推荐使用 LongAdder 对象…
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/concurrency/multithreading/index.md 并发(Concurrency) 与并行(Parallelism) 以KTV唱歌为例, Parallelism 是指有多少人可以使用话筒同时唱歌, Concurrency是指同一个话筒被多少个人轮流使用; 一个科室两个专家同时出诊, 就是两个并行任务; 其中一个医生时而问诊, 时而…
前言 前段时间把 JDK 1.6 中的 HashMap 主要的一些操作源码分析了一次.既然把 HashMap 源码分析了, 就顺便把 JDK 1.6 中 ConcurrentHashMap 的主要一些操作源码分析一下.因为其中有很多思想是值得我们去借鉴的. ConcurrentHashMap 中的分段锁.这个思想在 JDK 1.8 中 为了优化 JUC 下的原子锁 CAS 高并发情况下导致自旋次数太多效率低下.引用 Adder .其中就是借鉴了分段锁的思想.AtomicLong 对比 LongA…
AtomicReference和AtomicLong.AtomicInteger很像,方法也基本上是一样的,然后我们通过引用Integer来做一个简单的例子. com.mmall.concurrency.example.atomic.AtomicExample4 C:\Users\ZHONGZHENHUA\imooc\concurrency\src\main\java\com\mmall\concurrency\example\atomic\AtomicExample4.java package…
  看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是使用由并发处理的专业人员实现的较高层次的结构要方便.安全得多. 阻塞队列   对于许多线程问题,都可以使用一个或多个队列来安全.优雅的进行数据的传递.比如经典的生产者--消费者问题,生产者不停的生成某些数据,消费者需要处理数据,在多线程环境中,如何安全的将数据从生产者线程传递到消费者线程?   无需…
这是java高并发系列第32篇文章. java环境:jdk1.8. 本文主要内容 4种方式实现计数器功能,对比其性能 介绍LongAdder 介绍LongAccumulator 需求:一个jvm中实现一个计数器功能,需保证多线程情况下数据正确性. 我们来模拟50个线程,每个线程对计数器递增100万次,最终结果应该是5000万. 我们使用4种方式实现,看一下其性能,然后引出为什么需要使用LongAdder.LongAccumulator. 方式一:synchronized方式实现 package…
java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全体现在三个方面: 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作 可见性:一个线程对主内存的修改可以及时的被其他线程观察到 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序. 原子性:Atom…
上篇博客我们看了AtomicLong和LongAdder的由来,但是有的时候我们想一下,LongAdder这个类也有点局限性,因为只能是每一次都+1,那有没有办法每次+2呢?或者每次乘以2?说得更抽象一点,我们能不能自己指定规则呢?干嘛老是傻乎乎的+1呢? 于是就有了LongAccumulator这个累加器,这个累加器更加抽象,前面使用的LongAdder只不过是这个累加器的一个特例,由此我们可以猜出这个累加器功能更加强大,但是需要我们自己的定制规则: 前提:看本篇博客的人应该熟悉jdk8中的函…
引言 JUC即java.util.concurrent,是java提供的用于多线程处理的工具类库.重点关注 ConcurrentXXX.AtomicXXX.Executor.Caller&&Future.Queue.Locks. 打开jdk包,JUC代码就在rt.jar包中,concurrent下有atomic和locks两个package,并且还有concurrentXXX.Executor.Future.Queue等.想查看源码的话,JDK 安装的目录下有个 src.zip —— 这就…
摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Atomic包中的类与CAS: AtomicInteger AtomicLong 与 LongAdder AtomicBoolean AtomicIntegerFieldUpdater AtomicStampReference与CAS的ABA问题 AtomicLongArray synchronized…
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized(如有不懂请移至传送门,关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优化,你该了解这些  ),还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入源码分析. 提出问题:int线程安全吗? 看过Synchronized相关文章的小伙伴应该知道其是不安全的,再次用代码应验下其不安全性: public class testInt…