android AtomicBoolean类的使用
今天,简洁讲讲如何使用
AtomicBoolean这个类。
类
在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference等类,它们的基本特性就是在多线程环境下,执行这些类实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。
- 介绍:
在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性
- 方法和举例
- 1.compareAndSet(boolean expect, boolean update)
这个方法主要两个作用 1. 比较AtomicBoolean和expect的值,如果一致,执行方法内的语句。其实就是一个if语句 2. 把AtomicBoolean的值设成update 比较最要的是这两件事是一气呵成的,这连个动作之间不会被打断,任何内部或者外部的语句都不可能在两个动作之间运行。为多线程的控制提供了解决的方案。
这个函数应该是比较常用的,下面讲讲其他的基本使用。
2.构造函数
1.
AtomicBoolean()
使用初始值
false
创建新的AtomicBoolean
。2.
AtomicBoolean(
boolean initialValue)使用给定的初始值创建新的
AtomicBoolean
。3.方法详解
get
public final boolean get()
- 返回当前值。
-
- 返回:
- 当前值
compareAndSet
public final boolean compareAndSet(boolean expect,boolean update)
-
如果当前值
==
预期值,则以原子方式将该值设置为给定的更新值。 -
- 参数:
-
expect
- 预期值 -
update
- 新值 - 返回:
- 如果成功,则返回 true。返回 False 指示实际值与预期值不相等。
weakCompareAndSet
public boolean weakCompareAndSet(boolean expect,boolean update)
-
如果当前值
==
预期值,则以原子方式将该值设置为给定的更新值。可能意外失败并且不提供排序保证,因此几乎只是
compareAndSet
的适当替代方法。 -
- 参数:
-
expect
- 预期值 -
update
- 新值 - 返回:
- 如果成功,则返回 true。
set
public final void set(boolean newValue)
- 无条件地设置为给定值。
-
- 参数:
-
newValue
- 新值
lazySet
public final void lazySet(boolean newValue)
- 最终设置为给定值。
-
- 参数:
-
newValue
- 新值 - 从以下版本开始:
- 1.6
getAndSet
public final boolean getAndSet(boolean newValue)
- 以原子方式设置为给定值,并返回以前的值。
-
- 参数:
-
newValue
- 新值 - 返回:
- 以前的值
toString
public String toString()
- 返回当前值的字符串表示形式。
-
- 覆盖:
-
类
Object
中的toString
-
- 返回:
- 当前值的字符串表示形式。
下面简单举一个使用的例子。
以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();} }
这是将网上资料进行了这里,大家可以自己去查找资料看看。其实我也基本没有使用过这个类,但是记录一下。
android AtomicBoolean类的使用就讲完了。
就这么简单。
android AtomicBoolean类的使用相关推荐
- Android Bundle类 学习总结
Android Bundle类 http://blog.csdn.net/randyjiawenjie/article/details/6651437 根据google官方的文档(http://dev ...
- android Integer类的toString函数的使用
今天,简单讲讲android里如何使用Integer类的toString函数. 这个其实很简单,就是将整数转成字符串.不过之前一直使用的是String.value()来进行转换的.后来在为网上查 ...
- android Rect类的使用
今天,讲讲Android的Rect类的使用. public final class Rect extends Object implements Parcelable java.lang.Object ...
- Android Canvas类介绍和Android Draw Rect 坐标图示
当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...
- Android生命周期帮助类,Android Service类与生命周期详细介绍_Android_脚本之家
Android Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Ser ...
- Android 服务类Service 的详细学习
http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...
- Android 工具类
前言 相信用过工具类的各位仁兄都觉得工具类好用,小弟不才,今天斗胆拿出自己感觉比较顺手的工具类. 1.Activity控制类 public class ActivityCollector{//acti ...
- android动画类
android动画类有三种实现形式,分别是Property Animation,Frame Animation,Tween Animation.Tween Animation主要是实现图片的移动来实现 ...
- Android Canvas类
1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override prot ...
最新文章
- Samba通过ad域进行认证并限制空间大小《转载》
- 机器学习知识点(三十六)分类器性能度量指标f1-score
- java 坐标系转换_入门-Python-GIS坐标转换
- matlab调用q外部exe文件,Matlab GUI调用外部程序生成exe,DOS窗口输入问题
- How to use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem
- ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项
- 前端学习(1353)模板语法条件判断
- Scikit-learn的分类器算法:k-近邻及案例
- 一个简单的Kafka Flink Rabbitmq Demo
- 驱动编程class_create说明
- 大数据_Hbase-(数据写入流程)---Hbase工作笔记0009
- 技巧篇-图层叠加之美(一)
- C++ 类型转换归纳
- 吉林大学校园网linux客户端,吉林大学校园网认证客户端 v5.2.1 pc版
- c语言自动插桩,静态插桩的方式来实现Hook Method
- Element UI中的Descriptions描述列表
- React 调和(Reconciler)原理理解
- RTX 4070TI和RTX 3090TI性能哪个好 RTX 4070ti和RTX3090ti 差距
- 【教学类-22-01】20221207《八款字体的描字帖-2*4格横条-用订书机》(中班描字)
- 什么是云计算领域的 orphaned resources
热门文章
- .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)...
- python-IDE的使用(小白先看)
- Hibernate性能提升
- ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解
- 在SQL Server 2005中解决死锁(转)
- at sixes and sevens用法
- 处理大并发的30条数据库规范
- Linux查看关机时间
- chrome开发总结(交互/权限/存储)-爬虫
- javascript学习-创建json对象数据,遍历