并发库应用之二 & Java原子性操作类应用
Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理。基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增、减、赋值(更新)操作
java.util.concurrent在并发编程中很常用的实用工具类。
|----locks为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器
|----atomic类的小工具包,支持在单个变量上解除锁的线程安全编程。可以对基本类型、数组中的基本类型、类中的基本类型等进行操作
|----AtomicInteger 用于提供整型数字原子性操作
|----AtomicIntegerArray 用于提供整型数组原子性操作
|----AtomicIntegerFieldUpdater 用于提供类对象中的整型数据原子性操作
...... 对应有Double...相类似的原子性操作类
以上原子性操作类具体如何使用详情可以查看相应的官方jdk文档,下面通过简单的两个例子的对比来看一下 AtomicInteger 的强大的功能,分别是普通的方法与使用AtomicInteger类的方法:
普通方法实现方案:
public class CommonTest {
private volatile int count = 0; //volatile关键字实现线程间数据共享
public synchronized void increment() {
count++; //若要线程安全执行,需要加锁
}
public int getCount() {
return count;
}
}
使用AtomicInteger类的方法实现
public class AtomicIntegerTest {
private AtomicInteger count = new AtomicInteger();
public synchronized void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
调用两个类的主方法实现
public class MainClass {
public static void main(String[] args) {
//final CommonTest atomicIntegerTest = new CommonTest();
final AtomicIntegerTest atomicIntegerTest = new AtomicIntegerTestTrue();
for (int j = 0; j < 3; j++) { //各自同时开启3个线程
//增加线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
atomicIntegerTest.increment();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//读取线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "-->" + atomicIntegerTest.getCount());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
运行结果如下所示:
Thread-1-->1
Thread-3-->2
Thread-5-->3
Thread-3-->4
Thread-1-->5
Thread-5-->5
Thread-1-->9
Thread-5-->9
Thread-3-->9
Thread-5-->12
Thread-3-->12
Thread-1-->12
Thread-3-->13
Thread-1-->13
Thread-5-->14
Thread-5-->16
Thread-1-->16
Thread-3-->16
Thread-1-->21
Thread-3-->21
Thread-5-->21
Thread-5-->22
Thread-1-->22
Thread-3-->22
Thread-1-->25
Thread-5-->25
Thread-3-->25
Thread-3-->29
Thread-1-->30
Thread-5-->29
从上面的例子中我们可以看出:使用AtomicInteger是非常的安全的
那么为什么不使用记数器自加呢,例如count++这样的,因为这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为什么能够达到多而不乱,处理高并发应付自如呢?
这是由硬件提供原子操作指令实现的。在非激烈竞争的情况下,开销更小,速度更快。
提示:常用基本类的原子操作讲解完毕,接下来我们就开始进入有关多线程线程池相关概念讲解,具体详情请查看我的下一篇博客:并发库应用之三 & 线程池与定时器应用
并发库应用之二 & Java原子性操作类应用的更多相关文章
- Java并发基础10:原子性操作类的使用
在 java5 以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: ...
- JAVA文件操作类和文件夹的操作代码示例
JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...
- Java大数操作类
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...
- Java文件操作类效率对比
前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...
- Java 数学操作类
数学操作类 Math类 数学计算操作类 类属性值 Math.E ^ Math.PI 圆周率 类方法 Math类中,一切方法都是 static 型,因为Math类中没有普通属性. round() 方法 ...
- 5、探秘JDK5新并发库之原子性操作类
java.util.concurrent.atomic包里提供了 AtomicBoolean 可以用原子方式更新的 boolean 值. AtomicInteger 可以用原子方式更新的 int 值. ...
- JAVA多线程提高五:原子性操作类的应用
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...
- JAVA多线程学习九-原子性操作类的应用
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...
- 从C,C++,JAVA和C#来看String库的发展(二)---JAVA和C#篇
http://www.cnblogs.com/wenjiang/p/3272859.html 终于要进入面向对象的世界了,虽然C++也是面向对象,但是它的面向对象程度并不高,因为考虑到要兼容C语言的移 ...
随机推荐
- 第十次作业psp
psp 进度条 博文累积折线图 代码累积折线图 psp饼状图
- MAX值-单元测试
#include<iostream> using namespace std; int Largest(int list[], int length); // list[]:求最大值的函数 ...
- 编程之法section II: 2.1 求最小的k个数
====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...
- 19_集合_第19天(List、Set)_讲义
今日内容介绍 1.List接口 2.Set接口 3.判断集合唯一性原理 非常重要的关系图 xmind下载地址 链接:https://pan.baidu.com/s/1kx0XabmT27pt4Ll9A ...
- CANOpen的几种操作以及数据
其实3年前在21ic就准备做这篇文章了,那时,CANOpen也只是刚刚在国内推广,所以几乎没有项目用到.现在有了实际的项目,完全确认了以前移植和测试的代码,所以列举一些CANOpen的底层操作以及数据 ...
- 软工网络15团队作业8——Beta阶段冲刺合集
博客链接集合 Beta阶段敏捷冲刺计划博客 Beta阶段冲刺第一天 Beta阶段冲刺第二天 Beta阶段冲刺第三天 Beta阶段冲刺第四天 Beta阶段冲刺第五天
- Python入门:参数传递方式
这是关于Python的第5篇文章,主要介绍下参数传递方式和如何设计自己的函数. (一) 本篇主要介绍2种参数传递方式. 位置参数 调用函数时,根据函数定义的参数位置来传递参数. def right_t ...
- myisam和innodb 删除一条记录后,再次添加后,最大记录值
- 多校联赛7 1001 hdu 4666(最远哈曼顿距离+优先队列)
吐个糟,尼玛今天被虐成狗了,一题都没搞出来,这题搞了N久居然还是搞不出来,一直TLE,最后还是参考别人代码才领悟的,思路就这么简单, 就是不会转弯,看着模板却不会改,艹,真怀疑自己是不是个笨蛋题意:求 ...
- RHEL/Centos下VSFTPD服务器搭建
目的 Linux下安装配置vsfptd服务器,并通过客户端验证. 环境 Centos 6 局域网 内容 配置Vsftpd服务器:实现匿名用户.本地用户和虚拟用户登录的配置.匿名用户可以上载文件,上载后 ...