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

     

  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/aituming/p/6257850.html
Copyright © 2011-2022 走看看