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. 单词words

    论一类脑筋急转弯题和奇技淫巧题的解题技巧 [题意] 给定n个长为m且只包含xyz的字符串,定义两个字符串的相似程度为它们对应位置相同字符个数(比如xyz和yyz的相似程度为2,后两位相同),分别求出相 ...

  2. Html 两个DIV并排的问题

    在一个容器内部,要放在两个并排的DIV,两个方法: 1.使用浮动.这个方式div是脱离文档流的,在窗口布局复杂,大小变化的时候,可能会有一些不希望的情况发生. <!DOCTYPE HTML> ...

  3. 【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别

    From the previous posts, I have analysed 4 different Docker multi-host network solutions - Calico, F ...

  4. MySQL的语句执行顺序

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

  5. jquery返回滚动条顶部

    var $view = $('html,body'),$backTop = $('#backTop'), $backTop.on('click',function(){ $view.animate({ ...

  6. Pyqt 动态的添加控件

    Pyqt 动态的添加控件 # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys ...

  7. C语言中的强符号与弱符号

    转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...

  8. STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱?

    STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱? STM32F系列单片机芯片解密型号: STM32F100  |  STM32F101  |  STM32F102  | ...

  9. php实现数据库数据读取生成缓存文件

    有些时候我们希望减少对数据库的 查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用文件的形式保存 起来.比如对于一个商城 ...

  10. 基于socket的客户端和服务端聊天简单使用 附Demo

    功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...