java.util.concurrent.atomic.AtomicBoolean
继承自Object。
  • 介绍:

在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性

  • 方法和举例
  • compareAndSet(boolean expect, boolean update)

这个方法主要两个作用

1. 比较AtomicBoolean和expect的值,如果一致,执行方法内的语句。其实就是一个if语句

2. 把AtomicBoolean的值设成update

比较最要的是这两件事是一气呵成的,这连个动作之间不会被打断,任何内部或者外部的语句都不可能在两个动作之间运行。

为多线程的控制提供了解决的方案。

使用:

  1. private static class BarWorker implements Runnable {
  2. private static boolean exists = false;
  3. private String name;
  4. public BarWorker(String name) {
  5.   this.name = name;
  6. }
  7. public void run() {
  8. if (!exists) {
  9. exists = true;
  10.     System.out.println(name + " enter");
  11. System.out.println(name + " working");
  12. System.out.println(name + " leave");
  13. exists = false;
  14. }else {
  15. System.out.println(name + " give up");
  16. }
  17. }
  18. }

static变量exists用来实现同一时间只有一个worker在工作.

但是假设exists的判断和exists = true;之间有了 其他指令呢?

Java代码

  1. private static class BarWorker implements Runnable {
  2. private static boolean exists = false;
  3. private String name;
  4. public BarWorker(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. if (!exists) {
  9. try {
  10. TimeUnit.SECONDS.sleep(1);
  11. } catch (InterruptedException e1) {
  12. // do nothing
  13. }
  14. exists = true;
  15. System.out.println(name + " enter");
  16. try {
  17. System.out.println(name + " working");
  18. TimeUnit.SECONDS.sleep(2);
  19. } catch (InterruptedException e) {
  20. // do nothing
  21. }
  22. System.out.println(name + " leave");
  23. exists = false;
  24. } else {
  25. System.out.println(name + " give up");
  26. }
  27. }
  28. }
  1. private static class BarWorker implements Runnable {
  2. private static boolean exists = false;
  3. private String name;
  4. public BarWorker(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. if (!exists) {
  9. try {
  10. TimeUnit.SECONDS.sleep(1);
  11. } catch (InterruptedException e1) {
  12. // do nothing
  13. }
  14. exists = true;
  15. System.out.println(name + " enter");
  16. try {
  17. System.out.println(name + " working");
  18. TimeUnit.SECONDS.sleep(2);
  19. } catch (InterruptedException e) {
  20. // do nothing
  21. }
  22. System.out.println(name + " leave");
  23. exists = false;
  24. } else {
  25. System.out.println(name + " give up");
  26. }
  27. }
  28. }

这时输出是 bar2 enter bar2 working bar1 enter bar1 working bar1 leave bar2 leave 看到两个线程同时工作了. 这时可以用AtomicBoolean Java代码

  1. private static class BarWorker implements Runnable {
  2. private static AtomicBoolean exists = new AtomicBoolean(false);
  3. private String name;
  4. public BarWorker(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. if (exists.compareAndSet(false, true)) {
  9. System.out.println(name + " enter");
  10. try {
  11. System.out.println(name + " working");
  12. TimeUnit.SECONDS.sleep(2);
  13. } catch (InterruptedException e) {
  14. // do nothing
  15. }
  16. System.out.println(name + " leave");
  17. exists.set(false);
  18. }else{
  19. System.out.println(name + " give up");
  20. }
  21. }
  22. }
  1. private static class BarWorker implements Runnable {
  2. private static AtomicBoolean exists = new AtomicBoolean(false);
  3. private String name;
  4. public BarWorker(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. if (exists.compareAndSet(false, true)) {
  9. System.out.println(name + " enter");
  10. try {
  11. System.out.println(name + " working");
  12. TimeUnit.SECONDS.sleep(2);
  13. } catch (InterruptedException e) {
  14. // do nothing
  15. }
  16. System.out.println(name + " leave");
  17. exists.set(false);
  18. }else{
  19. System.out.println(name + " give up");
  20. }
  21. }
  22. }

因为它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作, 中间不会提供可乘之机.输出为 bar1 enter bar1 working bar2 give up

AtomicBoolean介绍与使用的更多相关文章

  1. AtomicBoolean介绍

    网上资料: 使用 AtomicBoolean 高效并发处理 "只初始化一次" 的功能要求: 1 privatestatic AtomicBoolean initialized = ...

  2. Java并发编程(四):线程安全性

    一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...

  3. Java并发之原子操作类汇总

    当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...

  4. 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍

    1.  volatile 变量可以被看作是一种 "程度较轻的 synchronized". 2.  Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的 ...

  5. JMM以及并发三大特性介绍(包括解决方案)

    JMM结构图: JMM对同步的8种操作: JMM的同步规则: Countdownlatch介绍: 该类功能是可以阻塞线程,并在保证线程满足特定条件下,继续执行.如上图,Countdownlatch的c ...

  6. juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)

    一.AtomicInteger简介 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.以AtomicInteger对基本类型的原子类 ...

  7. java并发编程(十一)----(JUC原子类)基本类型介绍

    上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...

  8. AQS源码解析(一)-AtomicBoolean源码解析

    基本类: AtomicInteger AtomicLong AtomicBoolean 数组类型: AtomicIntegerArray AtomicLongArray AtomicReference ...

  9. CompletableFuture用法介绍

    一.CompletableFuture用法入门介绍 入门介绍的一个例子: package com.cy.java8; import java.util.Random; import java.util ...

随机推荐

  1. RedisUtil 工具类

    package com.test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import red ...

  2. jQuery ui autocomplete 与easyUI冲突解决办法(重命名ui的autocomplete 和menu部分)

    http://jqueryui.com/download/   UI定制只选autocomplete 会自动把依赖的menu模块也加入进来--然而easyUI也有自己的menu,于是就-- 折腾了好久 ...

  3. mac上安装ubuntu双系统

    mac和ubuntu双系统 mac系统安装ubuntu双系统的方法, mac系统要安装ubuntu, 必须使用u盘作为启动盘, 在mac启动的时候引导mac安装ubuntu, 下面为详细的安装方法: ...

  4. console的花式用法

    1.百度的招聘启示 如图: 下面是输出代码: if(window.console){ var cons = console; if(cons){ cons.log("%c\n ", ...

  5. 【poj3071】 Football

    http://poj.org/problem?id=3071 (题目链接) 题意 ${2^n}$个队伍打淘汰赛,输的被淘汰.第1个队打第2个队,第3个队打第4个队······给出第i个队伍打赢第j个队 ...

  6. 将上传图片转成base64(转)

    效果如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"><titl ...

  7. new bird in github

    首次使用先要建立本地github信息: git config - -global user.name  newbird git config - -global user.email   newbir ...

  8. initialization & finalization

    Delphi 的pas文件中可以有initialization和finalization两个关键字, 1.initialization关键字: 在initialization关键字到finalizat ...

  9. errored out in DoExecute, couldn't PrepareToExecuteJITExpression

    error: Couldn't materialize struct: size of variable <varName> disagrees with the ValueObject' ...

  10. CMake

    使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...