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         比较最要的是这两件事是一气呵成的,这连个动作之间不会被打断,任何内部或者外部的语句都不可能在两个动作之间运行。为多线程的控制提供了解决的方案。

[java] view plain copy

  1. private   static   class  BarWorker  implements  Runnable {  
  2.   
  3.   private   static   boolean  exists =  false ;  
  4.   
  5.   private  String name;  
  6.   
  7.   public  BarWorker(String name) {    this .name = name;  }  
  8.   
  9.   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" );   }  }  
  10.   
  11. }  

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

[java] view plain copy

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

 

[java] view plain copy

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

这时输出是 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.     
  3.    private   static  AtomicBoolean exists =  new  AtomicBoolean( false );     
  4.     
  5.    private  String name;     
  6.     
  7.    public  BarWorker(String name) {     
  8.     this .name = name;     
  9.   }     
  10.     
  11.    public   void  run() {     
  12.     if  (exists.compareAndSet( false ,  true )) {     
  13.     System.out.println(name +  " enter" );     
  14.      try  {     
  15.      System.out.println(name +  " working" );     
  16.      TimeUnit.SECONDS.sleep( 2 );     
  17.     }  catch  (InterruptedException e) {     
  18.       // do nothing      
  19.     }     
  20.     System.out.println(name +  " leave" );     
  21.     exists.set( false );     
  22.    } else {     
  23.     System.out.println(name +  " give up" );     
  24.    }     
  25.   }     
  26.     
  27.  }  

[java] view plain copy

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


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

posted @ 2015-04-08 11:13  dyc40021  阅读(190)  评论(0编辑  收藏  举报