AtomicBoolean的用法
2015-11-12 19:13
267 查看
首先先看如下例子
Java代码 收藏代码
static变量exists用来实现同一时间只有一个worker在工作. 但是假设exists的判断和exists = true;之间有了
其他指令呢
Java代码 收藏代码
这时输出是
bar2 enter
bar2 working
bar1 enter
bar1 working
bar1 leave
bar2 leave
看到两个线程同时工作了.
这时可以用AtomicBoolean
Java代码 收藏代码
因为它提供了原子性操作,其中exists.compareAndSet(false, true)这个操作把比较和赋值操作组成了一个原子操作,
中间不会提供可乘之机.输出为
bar1 enter
bar1 working
bar2 give up
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
相关文章推荐
- sqlserver清除日志
- jquery——九宫格大转盘抽奖
- 【C#】字符串与字符数组
- sqlserver清除日志
- Objective-C学习—UIWebView的使用
- 推送
- PHP5中的stdClass
- poj 3667 Hotel 【线段树区间合并】
- 理解矩阵
- jquery插件开发
- nyoj 区域赛系列一多边形划分 1103 (卡特兰打表)
- 基于内容的推荐(Content-based Recommendations)
- VisualSvn Server安装和使用
- [IOS开发] 微博开发平台SDK使用示例(iOS版)
- MySQL存储过程详解 mysql 存储过程
- 对一道数论题的推演
- Android中Handler的使用
- JAVA设计模式之工厂模式
- (转)Eclipse中使用Ant
- opencv的haar特征进行人脸识别