1. 程式人生 > >多執行緒原子操作:AtomicBoolean

多執行緒原子操作: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(falsetrue)) {  
  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