java中Atomic类之AtomicBoolean
类
在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相关推荐
- java中atomic特点,Java中Atomic类的使用分析
1:为什么会出现Atomic类 在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 稍有经验的同学都知道这种写法是线程不安全的.为了达到线程安全的目的,我们通常会用synchro ...
- java中properties作用,java中Properties类的使用
java中Properties类的使用 在java.util 包下面有一个类 Properties,该类主要用于读取以项目的配置文件(以.properties结尾的文件和xml文件). Propert ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...
- Java中Properties类的操作
Java中Properties类的操作 ============================================= com.gordon.constant Constant.java: ...
- Java中String类的方法及说明
String : 字符串类型 一.构造函数 String(byte[ ] bytes):通过byte数组构造字符串对象. String(char[ ] value):通过char数 ...
- java程序中出现两个class,Java中Class类中两个值得注意的进行类型动态转换的方法...
Java中的Class类有两个重要的方法:cast()和asSubclass().这两个方法都是用于Class类进行运行时(run-time)阶段的类型转换的.下面来看看他们的定义和使用: 第一个方法 ...
- Java 中,类、类对象、泛型之间的转换
Java 中,类.类对象.泛型之间的转换 R 为非泛型 获得类 通过类型名来获得类 通过对象来获得类 通过类名字符串来获得类 通过类来获得类名字符串 通过类来获得对象 使用 R 的无参数构造器来创建对 ...
- java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...
- java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...
最新文章
- Oracle sessions,processes 和 transactions 参数 关系 说明
- es6数组初始化_ES6 迭代器(Iterator)和 for...of循环使用方法
- 51. Leetcode 106. 从中序与后序遍历序列构造二叉树 (二叉树-二叉树构建)
- C语言结构体值复制与字符数组值复制的比较测试
- Fortinet 荣膺谷歌云年度安全技术合作伙伴奖
- 你把别人看透了 别人就看不透你了
- 为什么chm(帮助文档)打不开
- 骑行在路上的IT两年
- mysql主从复制1064_mysql主从复制或其他操作报错ERROR 1064 (42000): You have an er
- Matlab导出高DPI图像——生成高分辨率.eps .tiff .jpg图像的方法
- vue地址选择插件V - Distpicker
- 旅游网站毕业设计,旅游网站网页设计设计源码,旅游网站设计毕业论文
- 小米米家冰箱对开门尊享版 540L 评测
- 数字后端基本概念介绍Shape Blockage
- python百度云ocr文字识别软件_基于百度云的OCR识别(Python)
- vue将毫秒为单位的时间转化成分钟和秒
- 手把手教你实现小程序中的自定义组件
- Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
- 使用docx4j 实现word转pdf(linux乱码处理)
- mysql双一参数_mysql的双1设置