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. SQLite源程序分析之sqlite3.c

    /****************************************************************************** ** This file is an a ...

  2. 【原】iOS 同时重写setter和getter时候报错:Use of undeclared identifier '_name';did you mean 'name'

    写了那么多的代码了,平时也没有怎么注意会报这个错误,因为平时都很少同时重写setter和getter方法,一般的话,我们大概都是使用懒加载方法,然后重写getter方法,做一个非空判断.然后有时候根据 ...

  3. 冰冻三尺非一日之寒--web框架Django(翻页、cookie)

    第二十一章 cookie 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, ...

  4. 日历插件FullCalendar应用:(二)数据增删改

    接上一篇 日历插件FullCalendar应用:(一)数据展现. 这一篇主要讲使用fullcalendar插件如何做数据的增删改,用到了art.dialog web对话框组件,上一篇用到的webFor ...

  5. WPF学习系列 绘制旋转的立方体

    我是一年经验的web程序员,想学习一下wpf,比较喜欢做项目来学习,所以在网上找了一些项目,分析代码,尽量能够做到自己重新敲出来 第一个项目是 中间的方块会不停的旋转. 第一步,新建wpf项目 第二步 ...

  6. BZOJ 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

  7. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  8. 大数据量冲击下Windows网卡异常分析定位

    背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...

  9. springboot: mybatis集成参考

    http://blog.csdn.net/isea533/article/details/50359390

  10. [C#] NPOI Excel解析

    通过NPOI解析Excel,将数据保存到DataTable中. #region excel解析 public DataTable ImportExcelFile(string filePath) { ...