今天,简洁讲讲如何使用



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类的使用相关推荐

  1. Android Bundle类 学习总结

    Android Bundle类 http://blog.csdn.net/randyjiawenjie/article/details/6651437 根据google官方的文档(http://dev ...

  2. android Integer类的toString函数的使用

    今天,简单讲讲android里如何使用Integer类的toString函数.  这个其实很简单,就是将整数转成字符串.不过之前一直使用的是String.value()来进行转换的.后来在为网上查 ...

  3. android Rect类的使用

    今天,讲讲Android的Rect类的使用. public final class Rect extends Object implements Parcelable java.lang.Object ...

  4. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  5. Android生命周期帮助类,Android Service类与生命周期详细介绍_Android_脚本之家

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Ser ...

  6. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  7. Android 工具类

    前言 相信用过工具类的各位仁兄都觉得工具类好用,小弟不才,今天斗胆拿出自己感觉比较顺手的工具类. 1.Activity控制类 public class ActivityCollector{//acti ...

  8. android动画类

    android动画类有三种实现形式,分别是Property Animation,Frame Animation,Tween Animation.Tween Animation主要是实现图片的移动来实现 ...

  9. Android Canvas类

    1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override prot ...

最新文章

  1. Samba通过ad域进行认证并限制空间大小《转载》
  2. 机器学习知识点(三十六)分类器性能度量指标f1-score
  3. java 坐标系转换_入门-Python-GIS坐标转换
  4. matlab调用q外部exe文件,Matlab GUI调用外部程序生成exe,DOS窗口输入问题
  5. How to use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem
  6. ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项
  7. 前端学习(1353)模板语法条件判断
  8. Scikit-learn的分类器算法:k-近邻及案例
  9. 一个简单的Kafka Flink Rabbitmq Demo
  10. 驱动编程class_create说明
  11. 大数据_Hbase-(数据写入流程)---Hbase工作笔记0009
  12. 技巧篇-图层叠加之美(一)
  13. C++ 类型转换归纳
  14. 吉林大学校园网linux客户端,吉林大学校园网认证客户端 v5.2.1 pc版
  15. c语言自动插桩,静态插桩的方式来实现Hook Method
  16. Element UI中的Descriptions描述列表
  17. React 调和(Reconciler)原理理解
  18. RTX 4070TI和RTX 3090TI性能哪个好 RTX 4070ti和RTX3090ti 差距
  19. 【教学类-22-01】20221207《八款字体的描字帖-2*4格横条-用订书机》(中班描字)
  20. 什么是云计算领域的 orphaned resources

热门文章

  1. .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)...
  2. python-IDE的使用(小白先看)
  3. Hibernate性能提升
  4. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解
  5. 在SQL Server 2005中解决死锁(转)
  6. at sixes and sevens用法
  7. 处理大并发的30条数据库规范
  8. Linux查看关机时间
  9. chrome开发总结(交互/权限/存储)-爬虫
  10. javascript学习-创建json对象数据,遍历