`
kabike
  • 浏览: 597929 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

AtomicBoolean运用

阅读更多
首先先看如下例子
 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;之间有了
其他指令呢
 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
看到两个线程同时工作了.
这时可以用AtomicBoolean
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 up
分享到:
评论
5 楼 kabike 2015-08-28  
QQ1289714862 写道
这代码有问题吧 bar1 bar2 那来的 你是不是new了两个Runnable

应该是,太久了已经忘了
4 楼 QQ1289714862 2015-08-26  
这代码有问题吧 bar1 bar2 那来的 你是不是new了两个Runnable
3 楼 kabike 2013-09-24  
annybz 写道
我还想再问一共 问题,

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"); 
   } 
  } 
 
}
会不会第一个线程进入了if的方法,然后执行到 exists.set(false)之后,第二个线程才进入,这个时候不就可以是两个线程运行了吗,可是我执行了很多遍,发现始终只有一个线程在运行,您能给我解释下吗?谢谢

这个本来也没能防止两个线程同时运行,只是防止它俩同时进入临界区.exists.set(false)时,线程离开了临界区
2 楼 annybz 2013-09-22  
我还想再问一共 问题,

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"); 
   } 
  } 
 
}
会不会第一个线程进入了if的方法,然后执行到 exists.set(false)之后,第二个线程才进入,这个时候不就可以是两个线程运行了吗,可是我执行了很多遍,发现始终只有一个线程在运行,您能给我解释下吗?谢谢
1 楼 annybz 2013-09-22  
我试了第一个用exists控制只有一个线程运行的,结果是可能会看到一个线程运行,也可能看到2个线程运行的。


public class BarWorker implements Runnable {

private static Boolean exists = false;
private String name;

public BarWorker(String name) {
this.name = name;
}

@Override
public void run() {
System.out.println(name + "---"+exists);
if (!exists) {
exists = true;
System.out.println(name + "enter");
System.out.println(name + "working");
System.out.println(name + "leaving");
exists = false;

} else {
System.out.println(name + "give up");
}

}

public static void main(String[] args) {
BarWorker work1 = new BarWorker("bar1");
BarWorker work2 = new BarWorker("bar2");

Thread t1 = new Thread(work1);
Thread t2 = new Thread(work2);

t1.start();
t2.start();
}

}

相关推荐

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发... 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    java并发包资源

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    java 将amr文件转为MP3 需要的jar包

    import java.util.concurrent.atomic.AtomicBoolean; public class AudioConvert { /** * 音频转为Mp3 * @param source 需要转换的音频源文件 * @param desFileName 转换为mp3文件的路径 * @return ...

    Obotcha:C ++ 14编写的工具库

    Condition) ,读写锁(ReadWriteLock)线程等待锁(CountDownLatch,Barrier)基本数据类型的原子操作(AtomicBoolean,AtomicInteger等)文件读取/写入类(FileInputStream/FileOutputStream类)文件节点读取类

    Atomics:OSAtomic 包中一些原语的漂亮包装器,使用 Foundation 类型

    AtomicBoolean : BOOL标志的原子包装器 AtomicInteger :带有附加计数器语义( add-and-get 、 get-and-add )的NSInteger原子包装器(32 位或 64 位,取决于它编译的体系结构) AtomicReference :原子NSObject...

    ThreadTest:多线程

    AtomicInteger, AtomicLong, AtomicBoolean, AtomicReference main methods - get(), set(), lazySet(), compareAndSet(), weakCompareAndSet() 线程安全集合-并发集合 CopyOnWriteArrayList<E> ...

    Synchronizer

    线程数## Programacion Java 2015-I ###并发变量Atomicas 锁辛克罗尼兹多斯(Sincronizados) 并发收集框架### Variables Atomicas ###### a)标量原子变量AtomicInteger / AtomicLong / AtomicBoolean ###### b)...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段05讲 AtomicBoolean源码分析.mp4  高并发编程第三阶段06讲 AtomicLong源码分析.mp4  高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4  高并发编程第三阶段08讲 ...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段05讲 AtomicBoolean源码分析.mp4  高并发编程第三阶段06讲 AtomicLong源码分析.mp4  高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4  高并发编程第三阶段08讲 ...

Global site tag (gtag.js) - Google Analytics