在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference等类,它们的基本特性就是在多线程环境下,执行这些类实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。

举例说明

以AtomicBoolean为例,单线程执行普通的方法(如下),不会出现线程问题:

package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/
public class NormalBoolean implements Runnable{public static boolean exits = false;private String name;public NormalBoolean(String name){this.name = name;}@Overridepublic void run() {if(!exits){exits = true;System.out.println(name + ",step 1");System.out.println(name + ",step 2");System.out.println(name + ",step 3");exits = false;} else {System.out.println(name + ",step else");}}public static void main(String[] args) {new NormalBoolean("张三").run();}
}

然而,当多线程执行时,就会出现在执行判断之后的命令时,会有其他线程插入,变更exits的值。如下段代码:

package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/
public class NormalBoolean2 implements Runnable{public static boolean exits = false;private String name;public NormalBoolean2(String name) {this.name = name;}@Overridepublic void run() {if(!exits){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}exits = true;System.out.println(name + ",step 1");System.out.println(name + ",step 2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 3");exits = false;} else {System.out.println(name + ",step else");}}
}

同时执行两线程,打印结果为:

张三,step 1
李四,step 1
张三,step 2
李四,step 2
张三,step 3
李四,step 3

现在,使用AtomicBoolean就可以确保多线程的情况下安全的运行,只有一个线程进行业务处理。

package com.secbro.test.atomic;import java.util.concurrent.atomic.AtomicBoolean;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/
public class TestAtomicBoolean implements Runnable{public static AtomicBoolean exits = new AtomicBoolean(false);private String name;public TestAtomicBoolean(String name) {this.name = name;}@Overridepublic void run() {if(exits.compareAndSet(false,true)){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 1");System.out.println(name + ",step 2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 3");exits.set(false);} else {System.out.println(name + ",step else");}}
}

当两个线程执行此类时,打印结果如下:

张三,step else
李四,step 1
李四,step 2
李四,step 3

测试类:

package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/
public class TestBoolean {public static void main(String[] args) {Thread thread1 = new Thread(new NormalBoolean2("李四"));Thread thread2 = new Thread(new NormalBoolean2("张三"));thread1.start();thread2.start();//-------------------------------------------------------Thread thread3 = new Thread(new TestAtomicBoolean("李四"));Thread thread4 = new Thread(new TestAtomicBoolean("张三"));thread3.start();thread4.start();}
}

参考文章:http://thomaschen2011.iteye.com/blog/1468085

java中Atomic类之AtomicBoolean相关推荐

  1. java中atomic特点,Java中Atomic类的使用分析

    1:为什么会出现Atomic类 在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 稍有经验的同学都知道这种写法是线程不安全的.为了达到线程安全的目的,我们通常会用synchro ...

  2. java中properties作用,java中Properties类的使用

    java中Properties类的使用 在java.util 包下面有一个类 Properties,该类主要用于读取以项目的配置文件(以.properties结尾的文件和xml文件). Propert ...

  3. 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...

    [多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...

  4. Java中Properties类的操作

    Java中Properties类的操作 ============================================= com.gordon.constant Constant.java: ...

  5. Java中String类的方法及说明

    String : 字符串类型 一.构造函数      String(byte[ ] bytes):通过byte数组构造字符串对象.      String(char[ ] value):通过char数 ...

  6. java程序中出现两个class,Java中Class类中两个值得注意的进行类型动态转换的方法...

    Java中的Class类有两个重要的方法:cast()和asSubclass().这两个方法都是用于Class类进行运行时(run-time)阶段的类型转换的.下面来看看他们的定义和使用: 第一个方法 ...

  7. Java 中,类、类对象、泛型之间的转换

    Java 中,类.类对象.泛型之间的转换 R 为非泛型 获得类 通过类型名来获得类 通过对象来获得类 通过类名字符串来获得类 通过类来获得类名字符串 通过类来获得对象 使用 R 的无参数构造器来创建对 ...

  8. java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...

  9. java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...

最新文章

  1. Oracle sessions,processes 和 transactions 参数 关系 说明
  2. es6数组初始化_ES6 迭代器(Iterator)和 for...of循环使用方法
  3. 51. Leetcode 106. 从中序与后序遍历序列构造二叉树 (二叉树-二叉树构建)
  4. C语言结构体值复制与字符数组值复制的比较测试
  5. Fortinet 荣膺谷歌云年度安全技术合作伙伴奖
  6. 你把别人看透了 别人就看不透你了
  7. 为什么chm(帮助文档)打不开
  8. 骑行在路上的IT两年
  9. mysql主从复制1064_mysql主从复制或其他操作报错ERROR 1064 (42000): You have an er
  10. Matlab导出高DPI图像——生成高分辨率.eps .tiff .jpg图像的方法
  11. vue地址选择插件V - Distpicker
  12. 旅游网站毕业设计,旅游网站网页设计设计源码,旅游网站设计毕业论文
  13. 小米米家冰箱对开门尊享版 540L 评测
  14. 数字后端基本概念介绍Shape Blockage
  15. python百度云ocr文字识别软件_基于百度云的OCR识别(Python)
  16. vue将毫秒为单位的时间转化成分钟和秒
  17. 手把手教你实现小程序中的自定义组件
  18. Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
  19. 使用docx4j 实现word转pdf(linux乱码处理)
  20. mysql双一参数_mysql的双1设置

热门文章

  1. 华为OD机试用Python实现 -【信号发射和接收】(2023-Q1 新题)
  2. 影视编导必备三项知识
  3. java contenttype_如何在Flurl中更改Content-Type?
  4. 别人付费刷票,我用Python自动抢火车票
  5. 这 13 个 ChatGpt 的玩法,建议开发人员体验下
  6. Greenplum部署
  7. Outh2.0----支付宝接入
  8. 【电路设计】肌电信号采集电路分析
  9. 新手开店必备!亚马逊秒杀的收费须知!
  10. 为什么有时我们需要配置hosts来本地测试?