AtomicBoolean介绍与使用

java.lang.Object      

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

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

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

这个方法主要两个作用         1. 比较AtomicBoolean和expect的值,如果一致,执行方法内的语句。其实就是一个if语句         2. 把AtomicBoolean的值设成update         比较最要的是这两件事是一气呵成的,这连个动作之间不会被打断,任何内部或者外部的语句都不可能在两个动作之间运行。为多线程的控制提供了解决的方案。

[java] view plain copy

  1. private   static   class  BarWorker  implements  Runnable {
  2. private   static   boolean  exists =  false ;
  3. private  String name;
  4. public  BarWorker(String name) {    this .name = name;  }
  5. public   void  run() {    if  (!exists) {    exists =  true ;    System.out.println(name + " enter" );    System.out.println(name +  " working" );    System.out.println(name + " leave" );    exists =  false ;   }  else  {    System.out.println(name +  " give up" );   }  }
  6. }

static变量exists用来实现同一时间只有一个worker在工作. 但是假设exists的判断和exists = true;之间有了 其他指令呢 Java代码

[java] view plain copy

  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. }

[java] view plain copy

  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代码

[java] view plain copy

  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. }

[java] view plain copy

  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

时间: 2024-10-15 00:28:53

AtomicBoolean介绍与使用的相关文章

Java5对线程处理的新操作-concurrent包介绍

上节中简单介绍了传统的jdk中的线程的概念,本节中接着介绍下jdk5之后对线程处理有哪些改变. 首先,介绍下java.util.concurrent包下有个字包atomic(原子的)包,其中的一些类提供原子性操作类,分别是: 1 AtomicBoolean, 2 AtomicInteger,AtomicIntegerArray,AtomicIntegerFieldUpdater<T>, 3 AtomicLong,AtomicLongArray,AtomicLongFieldUpdater<

理解AtomicBoolean

前些天有朋友问我,经常在代码中看到Atomic开头的类,不明白是什么意思. 这里我们就从AtomicBoolean开始说吧,自己正好也复习一下.对于官方的说明是: 可以用原子方式更新的 boolean 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicBoolean 可用在应用程序中(如以原子方式更新的标志),但不能用于替换 Boolean. 换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个

原子操作类(一)原子操作类详细介绍

引言 ??Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞. ??因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,可分为4种类型的原子更新方式,分别是 原子更新基本类型 原子更新数组 原子更新引用 原子更新属性(字段) Atomic包里的类基

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

JMM结构图: JMM对同步的8种操作: JMM的同步规则: Countdownlatch介绍: 该类功能是可以阻塞线程,并在保证线程满足特定条件下,继续执行.如上图,Countdownlatch的cnt初始值是3,线程A调用await()方法,会阻塞,t1,t2,t3每次执行会将cnt-1,然后继续执行.直到cnt的值为0,则TA继续执行. 假设只有两个车道,同一地点,只能同时有两辆车通过,即并发就是两个.Semaphore优势是可以控制同一时间,线程的并发量. 原子性介绍: 先看看jdk中a

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

基本类: AtomicInteger AtomicLong AtomicBoolean 数组类型: AtomicIntegerArray AtomicLongArray AtomicReferenceArray 介绍 由于在多线程条件下,如果对共享变量修改容易造成数据不一致的情况,所以对于共享变量需要保证线程安全有有如下几种方式: 使用lock或者synchronized进行同步共享变量 使用CAS方法来保证修改变量为原子性操作 该类为后者,基于CAS方式修改具有原子性. 实现原理 将boole

CompletableFuture用法介绍

一.CompletableFuture用法入门介绍 入门介绍的一个例子: 1 package com.cy.java8; 2 3 import java.util.Random; 4 import java.util.concurrent.CompletableFuture; 5 6 public class CompletableFutureInAction { 7 private final static Random RANDOM = new Random(System.currentTi

IPC机制之基本介绍

综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道.信号量.消息队列.内存共享.套接字等进行进程间通信.那么在Android系统中我们可以通过Binder来进行进程间的通信.当然除了Binder我们还可以使用Socket来进行进程间的通信.  既然需要进程通信,那么就必须有多个进程.当然,在两个应用交互中必然出现多进程的情况.若是在一个应用中呢?我们

数据库介绍与分类

目录 数据库介绍与分类... 1 1.1 数据库介绍... 2 1.1.1什么是数据库... 2 1.2数据库的种类... 2 1.2.1关系型数据库介绍... 2 1.2.2非关系型数据库介绍... 3 1.3 常用关系型数据库产品介绍... 4 1.3.1 Oracle数据库... 4 1.3.2 MySQL数据库... 5 1.3.3 MariaDB数据库... 5 1.3.4 SqlServer数据库... 6 1.3.5 Access数据库... 6 1.3.6 其他不常用数据库...

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的