AtomicBoolean运用
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
AtomicBoolean运用的更多相关文章
- AtomicBoolean使用
使用 AtomicBoolean 高效并发处理 "只初始化一次" 的功能要求: 1 private static AtomicBoolean initialized = new A ...
- AtomicBoolean介绍与使用
java.util.concurrent.atomic.AtomicBoolean 继承自Object. 介绍: 在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性 方法和举例 ...
- JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)
AtomicBoolean它允许一个线程等待一个线程完成任务,然后运行: A boolean value that may be updated atomically. See the java.ut ...
- Java AtomicBoolean (Java代码实战-008)
值得一提的是,Java的AtomXXX类并不是使用了锁的方式进行同步,而是采用了一种新的理念,叫做CAS(Compare And Swap)CAS是一组CPU原语指令,用来实现多线程下的变量同步(原子 ...
- C# AtomicBoolean
using System; using System.Threading; /// <summary> /// Provides lock-free atomic read/write u ...
- AtomicBoolean
它的两种用法: 1.保证某段语句只执行一次. 首先我们要知道compareAndSet的作用,判断对象当时内部值是否为第一个参数,如果是则更新为第二个参数,且返回ture,否则返回false.那么默认 ...
- java并发编程:线程安全管理类--原子操作类--AtomicBoolean
1.类AtomicBoolean
- Java并发包:AtomicBoolean和AtomicReference
AtomicBoolean AtomicBoolean是一个读和写都是原子性的boolean类型的变量.这里包含高级的原子操作,例如compareAndSet().AtomicBoolean位于J ...
- juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)
一.AtomicInteger简介 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.以AtomicInteger对基本类型的原子类 ...
随机推荐
- 单词words
论一类脑筋急转弯题和奇技淫巧题的解题技巧 [题意] 给定n个长为m且只包含xyz的字符串,定义两个字符串的相似程度为它们对应位置相同字符个数(比如xyz和yyz的相似程度为2,后两位相同),分别求出相 ...
- Html 两个DIV并排的问题
在一个容器内部,要放在两个并排的DIV,两个方法: 1.使用浮动.这个方式div是脱离文档流的,在窗口布局复杂,大小变化的时候,可能会有一些不希望的情况发生. <!DOCTYPE HTML> ...
- 【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
From the previous posts, I have analysed 4 different Docker multi-host network solutions - Calico, F ...
- MySQL的语句执行顺序
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- jquery返回滚动条顶部
var $view = $('html,body'),$backTop = $('#backTop'), $backTop.on('click',function(){ $view.animate({ ...
- Pyqt 动态的添加控件
Pyqt 动态的添加控件 # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys ...
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
- STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱?
STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱? STM32F系列单片机芯片解密型号: STM32F100 | STM32F101 | STM32F102 | ...
- php实现数据库数据读取生成缓存文件
有些时候我们希望减少对数据库的 查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用文件的形式保存 起来.比如对于一个商城 ...
- 基于socket的客户端和服务端聊天简单使用 附Demo
功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...