AtomicBoolean介绍与使用
java.util.concurrent.atomic.AtomicBoolean
继承自Object。
- 介绍:
在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性
- 方法和举例
- compareAndSet(boolean expect, boolean update)
这个方法主要两个作用
1. 比较AtomicBoolean和expect的值,如果一致,执行方法内的语句。其实就是一个if语句
2. 把AtomicBoolean的值设成update
比较最要的是这两件事是一气呵成的,这连个动作之间不会被打断,任何内部或者外部的语句都不可能在两个动作之间运行。
为多线程的控制提供了解决的方案。
使用:
- 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;之间有了 其他指令呢?
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");
- }
- }
- }
- 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 Java代码
- 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");
- }
- }
- }
- 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 privatestatic AtomicBoolean initialized = ...
- Java并发编程(四):线程安全性
一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...
- Java并发之原子操作类汇总
当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...
- 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍
1. volatile 变量可以被看作是一种 "程度较轻的 synchronized". 2. Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的 ...
- JMM以及并发三大特性介绍(包括解决方案)
JMM结构图: JMM对同步的8种操作: JMM的同步规则: Countdownlatch介绍: 该类功能是可以阻塞线程,并在保证线程满足特定条件下,继续执行.如上图,Countdownlatch的c ...
- juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)
一.AtomicInteger简介 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.以AtomicInteger对基本类型的原子类 ...
- java并发编程(十一)----(JUC原子类)基本类型介绍
上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...
- AQS源码解析(一)-AtomicBoolean源码解析
基本类: AtomicInteger AtomicLong AtomicBoolean 数组类型: AtomicIntegerArray AtomicLongArray AtomicReference ...
- CompletableFuture用法介绍
一.CompletableFuture用法入门介绍 入门介绍的一个例子: package com.cy.java8; import java.util.Random; import java.util ...
随机推荐
- 让Visual Studio 2013为你自动生成XML反序列化的类
Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签,让开发人员可以对所编辑文档的修改.查找.定位情 ...
- [转]CSS如何设置html table表格边框样式
原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...
- ios app 企业帐号发布,在浏览器中直接点击链接下载安装
软件环境:Xcode 6.4 参考链接: 1.http://zxs19861202.iteye.com/blog/1997722 2.http://www.cnblogs.com/abl1992/p/ ...
- 精通Web Analytics 2.0 (10) 第八章:竞争情报分析
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第八章:竞争情报分析 在现实世界中,收集竞争情报可能意味着雇人在竞争对手的垃圾桶(实际会发生!)翻找. 在虚拟世界中,堆如山的数 ...
- CodeForces 24D Broken Robot
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000 一 ...
- linux安装nexus
一.下载nexus 最新地址在:https://www.sonatype.com/download-oss-sonatype 我下载的是:nexus-2.14.1-01-bundle.tar.gz,是 ...
- 使用Xmanager访问CentOS远程桌面
最近在搞Qemu虚拟机相关的项目,需要用到Linux的桌面系统,用Xmanager连接CentOS桌面最方便了. Linux端:CentOS release 6.8 (Final) Windows端: ...
- pdo in 查询
$ids1 = implode(",",$upload_ids);if(!empty($upload_ids)){ $ids_db= pdo_fetchall('select id ...
- MediaElement 的两种模式
MediaElement 是一个 UIElement,它受 布局系统 支持并可用作许多控件的内容.它也可用在可扩展应用程序标记语言 (XAML) 以及代码中.另一方面,MediaPlayer 用于 D ...
- ORA-01722:无效数字
今天写查询语句,关联多张表,出现了这个错误. 结果发现时字段的数据类型不一致. select * from table_a a,table_b b where to_char(a.project_id ...