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. Android开发 Error:The number of method references in a .dex file cannot exceed 64K.

    在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把使用Java ...

  2. Android公共技术收集

    UML类图详解 详解Android主流框架不可或缺的基石(ClassLoader,泛型,反射,注解) 公共技术点之  Java注解Annotation 公共技术点之  Java反射Reflection ...

  3. BZOJ 3158: 千钧一发

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss ...

  4. Leetcode 15. 3Sum

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. linux安装tomcat

    一.下载tomcat 最新地址在:http://tomcat.apache.org 我下载的是:apache-tomcat-7.0.73.tar.gz,是已经编译好的包 解压文件后,移动到" ...

  6. Matlab插值函数

    x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...

  7. DirectX runtime

    DirectX 9.0 runtime etc https://www.microsoft.com/en-us/download/details.aspx?id=7087 DirectX 11 run ...

  8. SQL Server存储过程创建和修改

    create proc Get_Data( @Del_ID varchar(36))asselect * from Depts where DeptId=@Del_ID select * from D ...

  9. python 静态方法、类方法(二)

    <Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # - ...

  10. 简洁的div翻转案例

    <!DOCTYPE html> <html > <head> <title>test</title> <meta http-equiv ...