java.util.concurrent.atomic.AtomicBooleanhtml
继承自java.lang.Objectjava
// 使用: private static class BarWorker implements Runnable { private static boolean exists = false; private String name; public BarWorker(String name) { this.name = name; } public void run() { if (!exists) { exists = true; System.out.println(name + " enter"); System.out.println(name + " working"); System.out.println(name + " leave"); exists = false; } else { System.out.println(name + " give up"); } } }
static变量exists用来实现同一时间只有一个worker在工做, 可是假设exists的判断和exists = true;之间有了其余指令呢?api
Java代码多线程
private static class BarWorker implements Runnable { private static boolean exists = false; private String name; public BarWorker(String name) { this.name = name; } public void run() { if (!exists) { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e1) { // do nothing } exists = true; System.out.println(name + " enter"); try { System.out.println(name + " working"); TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { // do nothing } System.out.println(name + " leave"); exists = false; } else { System.out.println(name + " give up"); } } }
这时输出是 bar2 enter bar2 working bar1 enter bar1 working bar1 leave bar2 leave 看到两个线程同时工做了. 这时能够用AtomicBooleanoracle
Java代码this
private static class BarWorker implements Runnable { private static AtomicBoolean exists = new AtomicBoolean(false); private String name; public BarWorker(String name) { this.name = name; } public void run() { if (exists.compareAndSet(false, true)) { System.out.println(name + " enter"); try { System.out.println(name + " working"); TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { // do nothing } System.out.println(name + " leave"); exists.set(false); }else{ System.out.println(name + " give up"); } } }
由于它提供了原子性操做,其中exists.compareAndSet(false, true)这个操做把比较和赋值操做组成了一个原子操做, 中间不会提供可乘之机.输出为 bar1 enter bar1 working bar2 give upatom