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原子性操作类应用的更多相关文章

  1. Java并发基础10:原子性操作类的使用

    在 java5 以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: ...

  2. JAVA文件操作类和文件夹的操作代码示例

    JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...

  3. Java大数操作类

    Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...

  4. Java文件操作类效率对比

    前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...

  5. Java 数学操作类

    数学操作类 Math类 数学计算操作类 类属性值 Math.E ^ Math.PI 圆周率 类方法 Math类中,一切方法都是 static 型,因为Math类中没有普通属性. round() 方法 ...

  6. 5、探秘JDK5新并发库之原子性操作类

    java.util.concurrent.atomic包里提供了 AtomicBoolean 可以用原子方式更新的 boolean 值. AtomicInteger 可以用原子方式更新的 int 值. ...

  7. JAVA多线程提高五:原子性操作类的应用

    当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...

  8. JAVA多线程学习九-原子性操作类的应用

    当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...

  9. 从C,C++,JAVA和C#来看String库的发展(二)---JAVA和C#篇

    http://www.cnblogs.com/wenjiang/p/3272859.html 终于要进入面向对象的世界了,虽然C++也是面向对象,但是它的面向对象程度并不高,因为考虑到要兼容C语言的移 ...

随机推荐

  1. Daily Scrum 11.10

    今日完成任务: 1.加入更改头像功能 2.解决不发送激活邮件和重置密码邮件的问题 3.在服务器上部署网站 4.加入匿名提问功能 明日任务: 黎柱金 修改数据库用户表,实现用户积分管理功能 晏旭瑞 解决 ...

  2. 微信小程序之Flex布局

    微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...

  3. iOS- Exception Type: 00000020:什么是看门狗机制

      1.前言    前几天我们项目闪退之后遇到的一个Crash,之后逛了许多论坛,博客都没有找到满意的回复  在自己做了深入的研究之后,对iOS的看门狗机制有了一个基本的了解  而有很多奇怪的Cras ...

  4. redux相关专业名词及函数提要

    redux: 用来管理react app 状态(state)的一个架构. store: 通过createStore()创建,用来存放state,与react app是完全分离的.createStore ...

  5. vue.js 中slot 用处大(转载)

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...

  6. <构建之法>前三章读后感—软件工程

    本教材不同于其他教材一贯的理知识直接灌溉,而是以对话形式向我们传授知识的,以使我们更好地理解知识点,更加清晰明确. 第一章 第一章的概述中,书本以多种方式,形象生动地向我们阐述了软件工程的内容,也让我 ...

  7. 『编程题全队』Alpha 阶段冲刺博客Day4

    1.每日站立式会议 1.会议照片 2.昨天已完成的工作统计 孙志威: 1.添加团队界面下的看板容器SlotWidget 2.实现SlotWidgets的动态布局管理 3.实现团队/个人界面之间的切换 ...

  8. Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)

    文章转自:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/

  9. DataRow数组根据指定列排序

    正序:DataRow[] datarow = datarow.OrderBy(x=>x["Ybrq"]).ToArray(); 倒序:DataRow[] datarow = ...

  10. jquery datatables 添加跳转到指定页功能

    项目中使用了jquery datatables 作为我们的数据表格组件,但是分页上没有跳转到指定页,需要自己重新写.解决方法如下: 在设置dataTables的默认属性里设置它的drawCallbac ...