首先先看如下例子
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
分享到:
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发... 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 ...22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
import java.util.concurrent.atomic.AtomicBoolean; public class AudioConvert { /** * 音频转为Mp3 * @param source 需要转换的音频源文件 * @param desFileName 转换为mp3文件的路径 * @return ...
Condition) ,读写锁(ReadWriteLock)线程等待锁(CountDownLatch,Barrier)基本数据类型的原子操作(AtomicBoolean,AtomicInteger等)文件读取/写入类(FileInputStream/FileOutputStream类)文件节点读取类
AtomicBoolean : BOOL标志的原子包装器 AtomicInteger :带有附加计数器语义( add-and-get 、 get-and-add )的NSInteger原子包装器(32 位或 64 位,取决于它编译的体系结构) AtomicReference :原子NSObject...
AtomicInteger, AtomicLong, AtomicBoolean, AtomicReference main methods - get(), set(), lazySet(), compareAndSet(), weakCompareAndSet() 线程安全集合-并发集合 CopyOnWriteArrayList<E> ...
线程数## 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讲 ...
高并发编程第三阶段05讲 AtomicBoolean源码分析.mp4 高并发编程第三阶段06讲 AtomicLong源码分析.mp4 高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4 高并发编程第三阶段08讲 ...