java并发编程之三
来源:互联网 发布:网络吞吐量是什么意思 编辑:程序博客网 时间:2024/05/16 15:06
LockSupport工具
LockSupport定义了一组公共静态方法,这些方法提供了最基本的的线程阻塞和唤醒功能。其他类实现阻
塞和唤醒都会调用它。
Condition接口
类似java对象的等待/通知功能。回忆一下synchronized关键字的使用,利用java对象,实现锁的获取和释放
synchronized(object){
try{
object.await();
//object.notify();
}finally{
//...
}
}
在synchronized开始时获取锁,在结束处和其他必要的地方释放锁。还可以调用java对象去等待,等待是要
放弃锁的,当该线程被中断或者是被唤醒且获得锁后,会从await()中返回,其中等待中被中断,是抛异常
而从await()方法返回,所以需要用try包围await(),捕捉中断异常,上篇文章说过抛出中断异常其实是响应
中断的表现。调用await()和notify()时,如果该线程没有获得锁,则会抛出IllegalMonitorStateException。
所以都是在synchronized同步块中调用等待/通知的方法的。
而Condition是负责等待/通知部分的,而不负责获取和释放锁的实现的。即Conditon只负责管理等待队列,
但是Condition依赖Lock。
Object的等待/通知的相关方法和Condition接口对比,Condition更强大。一个Lock可以对应多个Condition,
也就是一个锁可以对应了多个等待队列,后面会说说一对多的意义。Condition增加了等待过程中不响应
中断的支持,定时从等待中返回的支持。
Condition使用实例
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void conditionWait() throws InterruptedException, IllegalMonitorStateException{ lock.lock(); try { condition.await();//注意要在获得condition对应的锁后才调用await } finally { lock.unlock();//在最后需要释放锁 } } public void conditionSignal() throws InterruptedException, IllegalMonitorStateException{ lock.lock(); try { condition.signal();//注意要在获得condition对应的锁后才调用signal } finally { lock.unlock();//在最后需要释放锁 } }
一个Lock对应多个Condition的意义
由生产者和消费者的例子可知,分别对同一变量作加1减1,需要有同步,
而而这个变量是一种资源,而Lock代表是一种资源(可以有多个同类资源由同一个锁控制,根据资源数定义
同步变量即可),而该锁对应的不同等待队列中节点表示不同的工作性质的线程,如生产者和消费者就是不同
工作性质,即对资源的不同操作。如果有多个生产者和多个消费者,用synchronized关键字是不能很好的实
现的,只能实现只有一个消费者和一个生产者的情况,因为一个等待队列无法区分开不同工作性质的线程。
Condition的实现
等待队列
等待队列是一个FIFO队列。同步队列和等待队列中的节点类型都是同步器的静态内部类。一个Condition包
括一个等待队列。队列的插入和移除都没有使用CAS,因为这些过程是都会检查是否持有锁,由锁来保证线
程安全。在Object的监视器模型中,一个对象拥有一个同步队列和等待队列,而并发包中的Lock拥有多个等
待队列和一个同步队列
等待
调用await()方法,使当前线程进入等待队列,然后释放锁,同时线程状态变为等待状态(阻塞)。
通知
调用Condition的signal()方法,将会唤醒在等待队列中等待时间最长的节点(首节点),在唤醒队列之前,
会将节点移到同步队列中
-----------------------------------------------------------------------------------------------------------------------------------------------
- java并发编程之三
- Java 并发编程之测试(三)
- Java 并发编程之测试(三)
- java 并发编程(三)之synchronized
- java 并发编程学习之三 ---- ReentrantLock
- Java 并发编程 之 volatile(三)
- java多线程与并发之java并发编程实践(三)
- Java 并发编程之任务取消 (三)
- Java 并发编程之线程池的使用 (三)
- Java 并发编程之线程池的使用 (三)
- Java并发编程读书笔记(三)之发布与溢出
- 笑谈java并发编程三之AtomicIntegerArray介绍
- java编程思想笔记-并发之线程协作(三)
- Java并发编程之三:volatile关键字解析
- JAVA并发编程笔记三
- Java 并发编程总结三
- Java并发编程(三)--ReentrantLock
- java并发编程 之 并发集合对象
- cell 上下非对称margin新方式
- 利用urllib和BeautifulSoup爬取维基百科的词条
- linux下各个目录的大致内容
- book1 unit4 in-class reading : Fresh Start
- 02Add Two Numbers
- java并发编程之三
- The import java.sql cannot be resolved
- 全局变量和scanf
- 字符设备驱动-中断方式操控按键
- struts2返回json格式数据
- 看懂UML类图和时序图【转载】
- 扩展KMP总结(模板题hdu2594)
- book1 unit4 after-class reading 1 : Becoming a Successful Student
- java自学资料整理