二、多线程之Atomic包
一、简介
1、原子操作
我们在使用变量的时候,经常会出现资源竞争的情况,为了保证变量安全,我们就会对对应的方法添加"synchronized"同步锁来达到目的,以保证线程安全。
而原子操作时一种线程安全的操作,在操作执行期间不会穿插任何操作。这意味着,我们不需要使用synchronized等同步串行机制去控制资源的访问。
2、atomic包
JDK在1.5已经开始提供了一些原子类,在:java.util.concurrent.atomic软件包下
这个包下提供了对int、long、array等的原子操作,简单来说,我们可以通过复用这些现有的类来达到线程安全的目的。
JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/atomic/package-frame.html
二、AtomicLong
以下,AtomicLong为例:
java.util.concurrent.atomic.AtomicLong类:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/atomic/AtomicLong.html
直接继承于Number类
这表明,使用它就像使用Number类一样简单,它就像是一个基本类型的包装类
1)初始化一个值
// 默认初始值为0 public AtomicLong atomicLong = new AtomicLong(); // 也可以赋值 public AtomicLong atomicLong = new AtomicLong(10L);
2)加
// 返回更新的值 atomicLong.addAndGet(1L) // 返回更新前的值 atomicLong.getAndAdd(1L)
3)自增
// 自增,返回更新的值 atomicLong.incrementAndGet(); // 自增,返回旧的值 atomicLong.getAndIncrement()
4)自减
// 自减,返回更新的值 atomicLong.decrementAndGet(); // 自减,返回旧的值 atomicLong.getAndDecrement();
5)设置值
// 设置值 atomicLong.set(10L); // 最后设定为给定值 atomicLong.lazySet(10L); // 设置值,返回旧值 atomicLong.getAndSet(2L); // 如果当前值 == 预期的值 那么设置为给定值 atomicLong.compareAndSet(1L, 2L); // 如果当前值 == 预期的值 那么设置为给定值 atomicLong.weakCompareAndSet(1L, 2L);
6)类型转换
// 返回double atomicLong.doubleValue(); // 返回float atomicLong.floatValue(); // 返回int atomicLong.intValue(); // 返回long atomicLong.longValue(); // 转换为字符串 atomicLong.toString();
7)获取当前值
atomicLong.get()
我们看到以上罗列的一些操作,把很多复合操作都变成了原子操作。还有一些常用的原子类,如:AtomicInterger、AtomicReference等类同
二、多线程之Atomic包的更多相关文章
- Java多线程之Atomic:原子变量与原子类
Atomic简介 Atomic包是java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类这个包里面提供了一组原子变量类. 其基本的特性就是在多线程 ...
- java多线程之Concurrent包
1.在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题. 2.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的 ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- 【C#】线程之Parallel
在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.Fo ...
- 多线程爬坑之路-J.U.C.atomic包下的AtomicInteger,AtomicLong等类的源码解析
Atomic原子类:为基本类型的封装类Boolean,Integer,Long,对象引用等提供原子操作. 一.Atomic包下的所有类如下表: 类摘要 AtomicBoolean 可以用原子方式更新的 ...
- 并发包学习之-atomic包
一,模拟并发代码: 线程不安全的代码 //并发模拟代码 public class CountExample { //请求总数 public static int clientTotal = 5000; ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
随机推荐
- 1305 Pairwise Sum and Divide(数学 ,规律)
HackerRank 1305 Pairwise Sum and Divide 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = ...
- Ajax请求参数解释
ajax常用的两个请求是get和post,而springmvc的控制层可以接收ajax请求. 但是这个过程非常灵活,变化很大,容易出错. $.ajax({ url : SITE_PATH + &quo ...
- java从txt文档读写数据
package com.abin.facade.ws.mail.function; import java.io.BufferedReader; import java.io.File; import ...
- 鸡肋点搭配ClickJacking攻击-获取管理员权限
作者:jing0102 前言 有一段时间没做测试了,偶尔的时候也会去挖挖洞.本文章要写的东西是我利用ClickJacking拿下管理员权限的测试过程.但在说明过程之前,先带大家了解一下ClickJac ...
- Maven镜像更换为阿里云中央仓库(精)
前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...
- [转] LVM分区在线扩容
[转] LVM分区在线扩容 在线扩容的这台服务器,LV分区格式为xfs,原大小1.2TB.增加了一块硬盘,大小为1.8TB. fdisk /dev/cciss/c0d1 # 创建分区,并指定分区类型为 ...
- jvm学习笔记(一)
一.java的运行原理 开发人员编写java代码(.java文件) 编译器将.java文件编译成字节码文件(.class文件) 字节码被装入内存,当字节码被装入内存之后,它就会被解释器解释执行或是被即 ...
- C++实现二叉树的相应操作
1. 二叉树的遍历:先序(递归.非递归),中序(递归.非递归),后序(递归.非递归). #include <iostream> #include <string> #inclu ...
- python --爬虫--爬取百度翻译
import requestsimport json class baidufanyi: def __init__(self, trans_str): self.lang_detect_url = ' ...
- Python中的匿名函数lambda的用法
一.lambda函数的简介 对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...