AtomicBoolean介绍与使用

java.lang.Object      extended by java.util.concurrent.atomic.AtomicBoolean
继承自Object。

  • 介绍:

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

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

使用:

private static class BarWorker implements Runnable {

 private static boolean exists = false;

 private String name;

 public BarWorker(String name) {   this.name = name;  }

 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");   }  }

}

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

private static class BarWorker implements Runnable {   
  
 private static boolean exists = false;   
  
 private String name;   
  
 public BarWorker(String name) {   
  this.name = name;   
 }   
  
 public void run() {   
  if (!exists) {   
   try {   
    TimeUnit.SECONDS.sleep(1);   
   } catch (InterruptedException e1) {   
    // do nothing   
   }   
   exists = true;   
   System.out.println(name + " enter");   
   try {   
    System.out.println(name + " working");   
    TimeUnit.SECONDS.sleep(2);   
   } catch (InterruptedException e) {   
    // do nothing   
   }   
   System.out.println(name + " leave");   
   exists = false;   
  } else {   
   System.out.println(name + " give up");   
  }   
 }   
  
}  


private static class BarWorker implements Runnable {

  private static boolean exists = false;

  private String name;

  public BarWorker(String name) {
   this.name = name;
  }

  public void run() {
   if (!exists) {
    try {
     TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e1) {
     // do nothing
    }
    exists = true;
    System.out.println(name + " enter");
    try {
     System.out.println(name + " working");
     TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
     // do nothing
    }
    System.out.println(name + " leave");
    exists = false;
   } else {
    System.out.println(name + " give up");
   }
  }

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

private static class BarWorker implements Runnable {   
  
  private static AtomicBoolean exists = new AtomicBoolean(false);   
  
  private String name;   
  
  public BarWorker(String name) {   
   this.name = name;   
  }   
  
  public void run() {   
   if (exists.compareAndSet(false, true)) {   
    System.out.println(name + " enter");   
    try {   
     System.out.println(name + " working");   
     TimeUnit.SECONDS.sleep(2);   
    } catch (InterruptedException e) {   
     // do nothing   
    }   
    System.out.println(name + " leave");   
    exists.set(false);   
   }else{   
    System.out.println(name + " give up");   
   }   
  }   
  
 }

private static class BarWorker implements Runnable {

  private static AtomicBoolean exists = new AtomicBoolean(false);

  private String name;

  public BarWorker(String name) {
   this.name = name;
  }

  public void run() {
   if (exists.compareAndSet(false, true)) {
    System.out.println(name + " enter");
    try {
     System.out.println(name + " working");
     TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
     // do nothing
    }
    System.out.println(name + " leave");
    exists.set(false);
   }else{
    System.out.println(name + " give up");
   }
  }

 }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值