zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Windows下搭建JSP开发环境
    ssh 学习笔记
    18 11 27 长连接 短链接
    18 11 26 用多进程 多线程 携程 实现 http 服务器的创建
    18 11 24 简单的http服务器
    关于 某个智慧树课堂的 机器与机器交流方法
    18 11 23 正则学习
    尝试解决 : Microsoft Visual C++ 14.0 is required 的问题
    18 11 20 网络通信 ----多任务---- 携程 ----生成器
    18 11 20 网络通信 ----多任务---- 携程 ----迭代器
  • 原文地址:https://www.cnblogs.com/dyc-cfc/p/4401868.html
Copyright © 2011-2022 走看看