AtomicBoolean运用

首先先看如下例子

  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;之间有了 
其他指令呢

  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

  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

AtomicBoolean运用的更多相关文章

  1. AtomicBoolean使用

    使用 AtomicBoolean 高效并发处理 "只初始化一次" 的功能要求: 1 private static AtomicBoolean initialized = new A ...

  2. AtomicBoolean介绍与使用

       java.util.concurrent.atomic.AtomicBoolean 继承自Object. 介绍: 在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性 方法和举例 ...

  3. JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)

    AtomicBoolean它允许一个线程等待一个线程完成任务,然后运行: A boolean value that may be updated atomically. See the java.ut ...

  4. Java AtomicBoolean (Java代码实战-008)

    值得一提的是,Java的AtomXXX类并不是使用了锁的方式进行同步,而是采用了一种新的理念,叫做CAS(Compare And Swap)CAS是一组CPU原语指令,用来实现多线程下的变量同步(原子 ...

  5. C# AtomicBoolean

    using System; using System.Threading; /// <summary> /// Provides lock-free atomic read/write u ...

  6. AtomicBoolean

    它的两种用法: 1.保证某段语句只执行一次. 首先我们要知道compareAndSet的作用,判断对象当时内部值是否为第一个参数,如果是则更新为第二个参数,且返回ture,否则返回false.那么默认 ...

  7. java并发编程:线程安全管理类--原子操作类--AtomicBoolean

    1.类AtomicBoolean

  8. Java并发包:AtomicBoolean和AtomicReference

      AtomicBoolean AtomicBoolean是一个读和写都是原子性的boolean类型的变量.这里包含高级的原子操作,例如compareAndSet().AtomicBoolean位于J ...

  9. juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)

    一.AtomicInteger简介 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.以AtomicInteger对基本类型的原子类 ...

随机推荐

  1. Java Swing

    参考帖子http://chenchaobox.blog.163.com/blog/static/6043759020127845945569/ http://wenku.baidu.com/link? ...

  2. Spring的测试

    spring测试要引用junit及spring-test <dependency> <groupId>junit</groupId> <artifactId& ...

  3. 【XLL 框架库函数】 TempErr/TempErr12

    创建一个包含了 Excel 工作表错误的临时 XLOPER/XLOPER12 原型 LPXLOPER TempErr(WORD err); LPXLOPER12 TempErr12(BOOL err) ...

  4. QT error: cannot find -lGL

    自己电脑新搭建的QT5.4.2编程环境,编译的第一个程序出现错误:error: cannot find -lGL 经查证,是找不到GL库,解决办法: sudo apt-get install libg ...

  5. Oracle 11g 新特性之Highly Available IP(HAIP)

    Redundant Interconnect with Highly Available IP (HAIP) 简介   从11.2.0.2开始,Oracle 的集群软件Grid Infrastruct ...

  6. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  7. Win10 UI入门窗口由默认500px to 320px

    https://code.msdn.microsoft.com/Layout-for-windows-that-ba648e1c/ https://msdn.microsoft.com/library ...

  8. AdaBoost算法分析与实现

    AdaBoost(自适应boosting,adaptive boosting)算法 算法优缺点: 优点:泛化错误率低,易编码,可用在绝大部分分类器上,无参数调整 缺点:对离群点敏感 适用数据类型:数值 ...

  9. Knockout.js随手记(4)

    动态绑定下拉列表 在<select> data-bind的options选项如果绑定到ko.observableArray(),就可以动态新增选项效果,也就是可以利用其完成常见的级联效果的 ...

  10. BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6014  Solved: 2503[Submit ...