zoukankan      html  css  js  c++  java
  • AtomicBoolean运用

    AtomicBoolean运用

    首先先看如下例子 

    Java代码  收藏代码
    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.    exists = true;  
    14.    System.out.println(name + " enter");  
    15.    System.out.println(name + " working");  
    16.    System.out.println(name + " leave");  
    17.    exists = false;  
    18.   } else {  
    19.    System.out.println(name + " give up");  
    20.   }  
    21.  }  
    22.   
    23. }  


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

    Java代码  收藏代码
    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代码  收藏代码
    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

     

  • 相关阅读:
    10分钟学会Python
    Python接口自动化(二)接口开发
    Python接口自动化(一)接口基础
    去掉webstorm内容区域右侧的一条竖线
    webstorm识别element-ui的标签
    vue中点击复制粘贴功能 clipboard 移动端
    vue pc element-ui class
    禁止浏览器记住密码
    js 将网络图片格式转为base64 canvas 跨域
    移动端网页在本地服务器调试
  • 原文地址:https://www.cnblogs.com/aituming/p/6257850.html
Copyright © 2011-2022 走看看