JAVA并发-AtomicLong
AtomicLong
类提供了long类型的变量与AtomicInteger非常类似,变量可以原子写和读,同时还包括先进的原子操作例如
compareAndSet()
。 AtomicLong
类位于java.util.concurrent.atomic
包中,全名java.util.concurrent.atomic.AtomicLong
。本文讲述JAVA8中的AtomicLong
,但是第一个版本是在Java 5中。
关于AtomicLong
设计原理可以参考
Compare and Swap
创建AtomicLong
如下代码创建 AtomicLong
:
AtomicLong atomicLong = new AtomicLong();
上述例子创建了初始值为0的AtomicLong
,如果需要创建指定值的AtomicLong
,则代码如下:
AtomicLong atomicLong = new AtomicLong(123);
例子中用123作为AtomicLong
构造函数的参数,意思就是AtomicLong
实例的初始值为123。
获取AtomicLong 的值
可以通过 AtomicLong
的
get()
方法获取值,下面是代码 AtomicLong
.get()
:
AtomicLong atomicLong = new AtomicLong(123);long theValue = atomicLong.get();
设置AtomicLong的值
可以通过 AtomicLong
的set()
方法设置值,下面是
AtomicLong
.set()
的例子
AtomicLong atomicLong = new AtomicLong(123);atomicLong.set(234);
例子中创建了一个初始值为123的 AtomicLong
,然后设置为234.
比较设置(CAS)AtomicLong的值
AtomicLong
类同样有原子的compareAndSet()方法,首先与AtomicLong
实例值得当前比较,如果相对这设置AtomicLong
的新值,下面AtomicLong
.compareAndSet()
代码:
AtomicLong atomicLong = new AtomicLong(123);long expectedValue = 123;
long newValue = 234;
atomicLong.compareAndSet(expectedValue, newValue);
首先创建初始值为123的 AtomicLong
实例,然后当前值与期望值123比较,如果相对则设置值为234.
增加AtomicLong的值
AtomicLong
类包含了一些增加和获取返回值的方法
:
addAndGet()
getAndAdd()
getAndIncrement()
incrementAndGet()
第一个方法 addAndGet()
,增加AtomicLong
的值同时返回增加后的值,第二个方法 getAndAdd()
增加值,但是返回增加之前的值,两个方法的差别看下面代码:
AtomicLong atomicLong = new AtomicLong();
System.out.println(atomicLong.getAndAdd(10));
System.out.println(atomicLong.addAndGet(10));
代码例子将为0和20,首先获取AtomicLong
增加10之前的值是0,然后再增加值并获取当前值是 20
.同样可以通过两个方法增加负值,相当于做减法,getAndIncrement()
和
incrementAndGet()
与 getAndAdd()
和
addAndGet()
的工作原理相似,只不是加1
.
AtomicLong减法
AtomicLong
类同样可以原子性的做减法,面是方法:
decrementAndGet()
getAndDecrement()
decrementAndGet()
方法减1并返回减后的值,getAndDecrement()同样减1并返回减之前的值
。
参考:http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html
http://tutorials.jenkov.com/java-util-concurrent/atomiclong.html
https://blog.csdn.net/cgsyck/article/details/107946058
JAVA并发-AtomicLong相关推荐
- Java并发编程73道面试题及答案——稳了
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户 ...
- Java并发编程题库
文章目录 并发编程三要素? 实现可见性的方法有哪些? 创建线程的有哪些方式? 创建线程的三种方式的对比? Runnable 和 Callable 的区别 Java线程具有五中基本状态 什么是线程池?有 ...
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...
- 10分钟搞定 Java 并发队列
前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...
- Java并发编程,无锁CAS与Unsafe类及其并发包Atomic
为什么80%的码农都做不了架构师?>>> 我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其 ...
- Java并发编程-并发工具包java.util.concurrent使用指南
译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurren ...
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User).任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bo ...
最新文章
- 深入浅出卷积神经网络及实现!
- FACTORY设计模式【让吃货也能理解的程序】
- yolo v3制作自己的数据_小白也能弄懂的目标检测之YOLO系列 第一期
- OpenGL 实例化	Instancing
- rabbitmq消息确认机制及死信队列的使用
- oracle启动监听_【DB笔试面试530】在Oracle中,有哪些重要后台进程?
- 蔡先生论道大数据之八: 让他在看小说的时候, 看到喜欢的汽车
- 转载 电子商务关键数字优化(线上部分,中)
- 融完5亿美元创始人出局?腾讯投资的明星无人车公司Zoox地震了
- CSS 块状元素和内联元素
- CNware存储管理功能介绍
- 高数 | 【微分方程】技巧性例题 及 李林880详解
- 计算机一级考试题库基础知识,计算机一级考试题库(含答案)
- k8s初始化报错[kubelet-check] Initial timeout of 40s passed.
- 病毒先生:天网恢恢,区块链行业的安全由谁来守护?
- 自己写Anki插件-单词宝
- 矩阵的转置与矩阵的逆
- Python下载网易云音乐(云音乐飙升榜)
- QT TreeView
- 出现跨域问题的原因及其解决方法
热门文章
- 开发企业级微信公众号【1天上线】
- xp系统的计算机管理中用户在哪里,计算机管理在哪里_打开XP系统计算机管理功能的两种方法...
- 不思议迷宫c语言基础,不思议迷宫新手必须知道的几件事情
- STL 配置器(allocator)
- [基于Python的微信公众号后台开发:2]文字消息的接收与解密
- python手机安装教程视频_python安装教程有没有?最好是视频的【安卓系统安装python环境】...
- uview 使用自定义图标
- 关键点匹配——商汤loFTR算法详解与论文解读
- Android 8.1 新增壁纸
- 从win7免费升到win10,再重装win10的方案(正版win10安装)