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

    首先先看如下例子
    Java代码 复制代码 收藏代码
    1. private static class BarWorker implements Runnable {
    2. private static boolean exists = false;
    3. private String name;
    4. public BarWorker(String name) {
    5. this.name = name;
    6. }
    7. public void run() {
    8. if (!exists) {
    9. exists = true;
    10. System.out.println(name + " enter");
    11. System.out.println(name + " working");
    12. System.out.println(name + " leave");
    13. exists = false;
    14. } else {
    15. System.out.println(name + " give up");
    16. }
    17. }
    18. }

    static变量exists用来实现同一时间只有一个worker在工作. 但是假设exists的判断和exists = true;之间有了
    其他指令呢
    Java代码 复制代码 收藏代码
    1. private static class BarWorker implements Runnable {
    2. private static boolean exists = false;
    3. private String name;
    4. public BarWorker(String name) {
    5. this.name = name;
    6. }
    7. public void run() {
    8. if (!exists) {
    9. try {
    10. TimeUnit.SECONDS.sleep(1);
    11. } catch (InterruptedException e1) {
    12. // do nothing
    13. }
    14. exists = true;
    15. System.out.println(name + " enter");
    16. try {
    17. System.out.println(name + " working");
    18. TimeUnit.SECONDS.sleep(2);
    19. } catch (InterruptedException e) {
    20. // do nothing
    21. }
    22. System.out.println(name + " leave");
    23. exists = false;
    24. } else {
    25. System.out.println(name + " give up");
    26. }
    27. }
    28. }

    这时输出是
    bar2 enter
    bar2 working
    bar1 enter
    bar1 working
    bar1 leave
    bar2 leave
    看到两个线程同时工作了.
    这时可以用AtomicBoolean
    Java代码 复制代码 收藏代码
    1. private static class BarWorker implements Runnable {
    2. private static AtomicBoolean exists = new AtomicBoolean(false);
    3. private String name;
    4. public BarWorker(String name) {
    5. this.name = name;
    6. }
    7. public void run() {
    8. if (exists.compareAndSet(false, true)) {
    9. System.out.println(name + " enter");
    10. try {
    11. System.out.println(name + " working");
    12. TimeUnit.SECONDS.sleep(2);
    13. } catch (InterruptedException e) {
    14. // do nothing
    15. }
    16. System.out.println(name + " leave");
    17. exists.set(false);
    18. }else{
    19. System.out.println(name + " give up");
    20. }
    21. }
    22. }

    因为它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作,
    中间不会提供可乘之机.输出为
    bar1 enter
    bar1 working
    bar2 give up 
  • 相关阅读:
    feign远程调用问题
    java8--stream
    feign业务组件远程请求 /oauth/token
    redis实现自增序列
    MySQL数据库 相关知识点
    netty
    spring的启动流程及bean的生命周期
    MethodHandleVS反射
    并发与并行
    关于注解的思考
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3576053.html
Copyright © 2011-2022 走看看