您的位置:首页 > 其它

AtomicBoolean的用法

2015-11-12 19:13 267 查看
首先先看如下例子

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) {
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");
}
}

}


这时输出是

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");
}
}

}


因为它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作,

中间不会提供可乘之机.输出为

bar1 enter

bar1 working

bar2 give up
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: