- 浏览: 280389 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
haiyangyiba:
jimichan 写道果然3.1.0.M2不行,切换到 3.1 ...
spring 使用注解装配的Bean如何使用property-placeholder属性配置中的值 -
lishl:
非常不错。用心之作。谢谢。
Jetty6 指南书 第4章 Jetty服务配置文件 -
Yinny:
楼主V5 网上的文章一搜一堆互相copy的,自己写的文章 太难 ...
Jetty6 指南和解析 - 第二章 Jetty初探 -
290845534:
wangpeihu 写道我想收藏,可是我不敢,我没有那500W ...
Jetty6 指南和解析 - 第二章 Jetty初探 -
宋建勇:
对于我们这些菜鸟来说,你突来停稿了,很伤脑筋啊,希望楼主继续! ...
时间飞快,jetty7已经发展成熟
第一部分 集合 http://jimichan.iteye.com/blog/951948
第二部分 线程池 http://jimichan.iteye.com/blog/951950
第三部分 锁 http://jimichan.iteye.com/blog/951954
第四部分 同步辅助类 http://jimichan.iteye.com/blog/951955
Concurrent In Java,第四部分 同步辅助类
2011-3-9 延昭 & 陈汝烨 版权所有,特别禁止发布到百度文库
这篇是来自公司内部分享会议是写的总结,有些内容没有表达出来,大家可以来踩,但是需留下原因,以便后续补充。
第一部分 集合 http://jimichan.iteye.com/blog/951948
第二部分 线程池 http://jimichan.iteye.com/blog/951950
第三部分 锁 http://jimichan.iteye.com/blog/951954
第四部分 同步辅助类 http://jimichan.iteye.com/blog/951955
4. 同步辅助类
你提交了一些任务,但你想等它们都完成了再做另外一些事情;你提交了一些任务,但是不想让它们立刻执行,等你喊123开始的时候,它们才开始执行;等等这些场景,线程之间需要相互配合,或者等待某一个条件成熟执行。这些场景想你就需要用到同步辅助类。
4.1 CountDownLatch
CountDownLatch 内部有个计数器,通过构造函数来指定。这个类就好比是倒计时的电子牌,当倒计时为0的时候就可以一起做一些事情。
摘自JavaDoc的方法介绍
void |
await() 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 |
boolean |
await(long timeout, TimeUnit unit) 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。 |
void |
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 |
long |
getCount() 返回当前计数。 |
摘自JavaDoc的例子
class Driver { // ...
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);
for (int i = 0; i < N; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed
doSomethingElse();
doneSignal.await(); // wait for all to finish
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() { ... }
}
当CountDownLatch(1)的时候,它就好比是个信号枪了。
4.2 CyclicBarrier
这个同步辅助类,它让多个线程可以在多个屏障点进行等待,所以叫cyclic,而且有个附加选择你可以在线程到达屏障点后执行一个任务(在释放其他线程之前)
new CyclicBarrier(N,
new Runnable() {
public void run() {
mergeRows(...);
}
});
为了帮助你理解,假设一个场景。
有一个任务,A、B、C分别从三个仓库(甲乙丙)搬运不同3个不同的零件到客户X的公司,然后再一起组装机器,完成后一起坐车去公司总部。
这个任务需要ABC三个线程同时进行,但是由于从仓库到客户X那边距离不等、交通状态未知的情况下,所花费的时间也不等。同时由于三个人负责的零件不同,所以安装机器的时候花费时间也不一样。这个场景中有两个需要线程间等待的地方。CyclicBarrier就可以闪亮登场了。
public class Main3 {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println("到达公共屏障点");
}
});
ExecutorService es = Executors.newCachedThreadPool();
es.submit(new Worker("A", 5000, 8000, barrier));
es.submit(new Worker("B", 2000, 16000, barrier));
es.submit(new Worker("C", 9000, 2000, barrier));
es.shutdown();
}
static class Worker implements Runnable {
String name;
int t1;// 搬运零件所需要的时间
int t2;// 参与组装工作需要的时间
CyclicBarrier barrier;
public Worker(String name, int t1, int t2, CyclicBarrier barrier) {
super();
this.name = name;
this.t1 = t1;
this.t2 = t2;
this.barrier = barrier;
}
@Override
public void run() {
try {
print(name + " 开始搬运零件");
Thread.sleep(t1);// 模拟搬运时间
print(name + " 到达目的地");
int a = barrier.await(); // 等待其他人
if(a==0){
//说明是最后一个到的可以执行特殊操作
}
print(name + " 开始组装机器");
Thread.sleep(t2);// 模拟组装时间.
print(name + " 完成组装机器");
barrier.await(); // 等待其他人组装完毕
print(name + " 一起回总公司");
} catch (Exception e) {
e.printStackTrace();
}
}
}
static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
static void print(String x) {
System.out.println( sdf.format(new Date()) + ": "+x);
}
}
4.3 Semaphore
一个经典的信号量计数器。一般被用来控制对共享资源同时访问线程数量的控制。
特殊情况下信号量设置为1,那么就类似互斥锁的功能。
此类的构造方法可选地接受一个公平 参数。当设置为 false 时,此类不对线程获取锁的顺序做任何保证。和之前提到的争用获取顺序一样,在非公平模式下,系统将获得更好的吞吐量,jvm也会保证在非公平模式下让所有线程得到访问机会。
参考书目
JavaDoc http://www.oschina.net/uploads/doc/javase-6-doc-api-zh_CN/overview-summary.html
java.util.concurrent 您不知道的 5 件事
http://www.ibm.com/developerworks/cn/java/j-5things4.html?ca=drs-
http://www.ibm.com/developerworks/cn/java/j-5things15/index.html
发表评论
-
spring 使用注解装配的Bean如何使用property-placeholder属性配置中的值
2012-03-13 14:03 13339很久没动笔了 spring 使用注解装配的Bean如何 ... -
轻松配置log4j,实现错误消息的Gtalk通知消息到智能手机。
2011-07-06 18:11 2007在Android手机上装个Gtalk,接收Log4j的异常提醒 ... -
系统URL规划
2011-06-13 12:18 0一个好的系统URL规划,不仅可以使得URL美观、简单易懂,而且 ... -
干掉讨厌的commons-logging依赖
2011-06-13 11:42 6222因为使用Slf4j,所以一直以来都对commons-loggi ... -
Concurrent In Java 6 分享,第三部分 锁
2011-03-10 11:45 3937第一部分 集合 http://jimich ... -
Concurrent In Java 6 分享,第二部分 线程池
2011-03-10 11:44 6579第一部分 集合 http://jimich ... -
Concurrent In Java 6 分享,第一部分 集合
2011-03-10 11:43 6165第一部分 集合 http://jimichan.i ... -
Concurrent In Java 6 分享 你不一定都了解
2011-03-10 11:27 2157由于帖子字数限制无法完整发布,请访问博客吧 第一 ... -
spring 2.5 中文chm文档
2010-07-22 16:00 4242换了个电脑,想看下spring 2.5 的中文chm文档。 ... -
正确使用ThreadPoolExecutor
2010-02-04 10:23 3011一直都是使用Executors.new ... -
jetty自带的服务端代理(proxy)
2009-11-02 13:33 6971代理配置的文档 http://docs.codehaus.or ... -
在eclipse中 配置spring 自定义的schema文件
2009-04-08 16:24 6910问题:使用了spring自定义schema时,在xml文件中无 ... -
spring jdbc的批处理功能 ---- 当中途失败时
2009-03-19 16:12 2648spring JdbcTemplate有一个功能是batchU ... -
搜索java类路径中文件的方法
2009-03-10 11:10 1916问题: 搜索所有类路径中所有符合文件名规则的资源? 解决方 ... -
spring事务管理在mysql数据库无法回滚
2008-11-07 11:31 3543检查了半天,配置和程序都没有问题,就是无法回滚数据。 最后才 ... -
oracle jdbc链接异常解决一则
2008-09-09 14:03 1655在linux 下连接另外一个oracle数据库出错了 异常: ... -
用java好久,今天才知道初始化集合还可以这样写
2008-05-06 16:53 14816Set set = new HashSet() {{ ... -
请教关于使用PropertyOverrideConfigurer,怎么覆写 bean引用的问题
2008-01-07 16:46 1588大家都知道使用PropertyOverrideConfigur ... -
理解javascript的类构造函数
2007-09-05 13:13 3110我们经常使用new运行符去create ... -
Struts2 Wildcard Mappings用法之访问tiles定义
2007-08-23 16:19 2528哈哈,终于可以用struts2了。以前没用过webwork,几 ...
相关推荐
`CyclicBarrier`也是一个同步辅助类,它允许一组线程互相等待,直到达到某个公共的屏障点。与`CountDownLatch`不同的是,`CyclicBarrier`可以在所有线程都到达屏障点后重置屏障,以便再次使用。 **2.4.3 `Semaphore...
CountDownLatch是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。它是一个一次性使用的计数器,当计数值为0时,所有等待的线程才能继续执行。CyclicBarrier则允许一组线程等待彼此到达屏障点后一起继续...
第四章重点介绍了如何在Java中创建和管理线程,包括线程的创建方式、线程间的通信以及如何利用线程来实现并发编程。 ##### 4.1 单向消息 单向消息是一种简单的线程间通信机制,其中发送者将消息传递给接收者,但不...
它是一个一次性使用的同步辅助工具,可以通过`await()`方法阻塞当前线程,直到所有计数器减到0。 - **CyclicBarrier**:让一组线程在预定义的执行点进行等待,当所有线程到达这个点时,它们会被同时释放继续执行。 -...
在Java编程中,多线程下载是一种常见的优化技术,它通过将大文件分割成多个小部分,然后在不同的线程中并行下载这些部分来提高下载速度。这种技术尤其适用于网络带宽有限或者文件体积庞大的情况。下面我们将深入探讨...
第四,关于死锁问题的讨论也是Java多线程面试的一个重要环节。面试者需要能够理解死锁产生的条件,即互斥条件、请求与保持条件、不剥夺条件和循环等待条件,并且能够给出解决死锁的策略。 第五,volatile关键字也是...
同步的实现方法主要是使用synchronized关键字和java.util.concurrent包下的各种锁。 51. 启动一个线程应该使用start()方法而不是run(),start()方法会创建新线程并调用run()。 上述知识点覆盖了Java面试宝典2017版...
- **CountDownLatch**、**CyclicBarrier**等同步辅助类,用于控制线程间的同步行为。 ### 总结 以上仅为文档部分内容的知识点概括,涉及Java基础语法、集合框架、并发编程等多个方面。这些知识点不仅对于Java...
《Java核心技术 卷II 高级特性(原书...尽管这部分内容并不直接涉及《Java核心技术 卷II 高级特性(原书第9版)》书中的知识点,但它却是Java学习者在寻找学习资源和提升技能时的辅助材料,对学习Java的人而言同样重要。
Java提供了丰富的并发工具类,如`java.util.concurrent`包,包括线程池、并发集合、同步器等,用于高效管理线程和数据同步。 5. **分布式缓存**:如 Hazelcast 或 Ehcache,它们可以在分布式系统中提供高速的数据...
- **并发工具类**:使用`java.util.concurrent`包中的工具类,如`ExecutorService`、`Future`和`Semaphore`等,替代传统的同步机制。 7. **枚举与注解** - **枚举优于常量类**:枚举提供更丰富的功能,如方法、...
6. **CountDownLatch**:这是一个同步辅助类,用于协调多个线程,让它们等待其他线程完成特定操作后才继续执行。 7. **CyclicBarrier**:循环栅栏,允许一组线程等待其他线程到达某个屏障点,然后一起继续执行。 8...
- **CountDownLatch**:是一种同步辅助工具类,允许一个或多个线程等待其他线程完成操作。 - **ConcurrentHashMap**:是Java中用于存储键值对的一种并发安全的散列表。 4. **代码解析**: 1. **...
4. **多用户同步与共享**:为了实现文件共享,可以利用Java的并发控制机制,如`synchronized`关键字和`java.util.concurrent`包中的工具类。文件的版本控制也非常重要,Java的`java.util.Versions`类可以辅助实现这...
5. **Java并发工具类**:对于系统操作讲师,理解Java的并发工具类如`java.util.concurrent`包下的Semaphore、CountDownLatch、CyclicBarrier等是必不可少的。文件可能通过实例解析这些工具的使用方法。 6. **分布式...
标题“juc2”可能指的是Java并发编程领域中的“Java Util Concurrency”(JUC)的第二部分,这个标签“HTML”可能与该主题的文档展示或者教程制作有关。由于没有提供具体的压缩包内容,我将基于这两个线索,主要围绕...
题目要求找出`java.util.concurrent`包下的四个类中差别最大的一个,选项分别为:`CountDownLatch`、`Future`、`Semaphore`、`ReentrantLock`。 - **CountDownLatch**:它是一种协调工具类,允许一个或多个线程等待...