• 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 
  • 相关阅读:
    Java
    Java
    Java
    其他
    Java
    Java
    Java
    正则
    Win10
    【转】Flask 上下文机制和线程隔离
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3576053.html
Copyright © 2020-2023  润新知