Condition并发
来源:互联网 发布:数字1一10的美工字体 编辑:程序博客网 时间:2024/06/03 17:59
一、介绍
Condition是在Java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。简单说,他的作用是使得某些线程一起等待某个条件(Condition),只有当该条件具备(signal 或者 signalAll方法被调用)时,这些等待线程才会被唤醒,从而重新争夺锁。
二、使用
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()。
三、示例代码
运行结果:
线程1拿到锁了
线程1等待信号
线程2拿到锁了
线程2发出信号
线程1拿到信号
四、原理
我们知道Lock的本质是AQS,AQS自己维护的队列是当前等待资源的队列,AQS会在资源被释放后,依次唤醒队列中从前到后的所有节点,使他们对应的线程恢复执行,直到队列为空。而Condition自己也维护了一个队列,该队列的作用是维护一个等待signal信号的队列。但是,两个队列的作用不同的,事实上,每个线程也仅仅会同时存在以上两个队列中的一个,流程是这样的:
1. 线程1调用reentrantLock.lock时,尝试获取锁。如果成功,则返回,从AQS的队列中移除线程;否则阻塞,保持在AQS的等待队列中。
2. 线程1调用await方法被调用时,对应操作是被加入到Condition的等待队列中,等待signal信号;同时释放锁。
3. 锁被释放后,会唤醒AQS队列中的头结点,所以线程2会获取到锁。
4. 线程2调用signal方法,这个时候Condition的等待队列中只有线程1一个节点,于是它被取出来,并被加入到AQS的等待队列中。注意,这个时候,线程1 并没有被唤醒,只是被加入AQS等待队列。
5. signal方法执行完毕,线程2调用unLock()方法,释放锁。这个时候因为AQS中只有线程1,于是,线程1被唤醒,线程1恢复执行。
所以:
发送signal信号只是将Condition队列中的线程加到AQS的等待队列中。只有到发送signal信号的线程调用reentrantLock.unlock()释放锁后,这些线程才会被唤醒。
可以看到,整个协作过程是靠结点在AQS的等待队列和Condition的等待队列中来回移动实现的,Condition作为一个条件类,很好的自己维护了一个等待信号的队列,并在适时的时候将结点加入到AQS的等待队列中来实现的唤醒操作。
await源码:
整个await的过程如下:1.将当前线程加入Condition锁队列。特别说明的是,这里不同于AQS的队列,这里进入的是Condition的FIFO队列。
2.释放锁。这里可以看到将锁释放了,否则别的线程就无法拿到锁而发生死锁。
3.自旋(while)挂起,直到被唤醒(signal把他重新放回到AQS的等待队列)或者超时或者CACELLED等。
4.获取锁(acquireQueued)。并将自己从Condition的FIFO队列中释放,表明自己不再需要锁(我已经拿到锁了)。
- Condition并发
- java并发-Condition接口
- 并发编程实践三:Condition
- 线程并发工具--Lock&Condition
- java并发-怎么理解Condition
- 并发编程:ReentranLock和Condition
- java并发编程之Condition
- Java并发编程(五)--Condition
- java并发---lock和condition
- 并发编程--并发编程包Condition条件
- 线程并发之Lock and Condition
- java并发编程(10)--Condition
- 乱弹java并发(六)-- Condition
- java并发控制:ReentrantLock Condition使用详解
- java并发API:Condition与ReentrantLock
- 【java并发】条件阻塞Condition的应用
- java并发编程——Condition
- Java并发实践: 显式锁之Condition使用
- BZOJ3670: [Noi2014]动物园
- POJ 2528 Mayor's posters (线段树区间赋值 + 离散化)
- java实现HTTP的post请求 key-value格式与json格式的区别
- Sublime Text3配置Node.js开发环境
- [bzoj2140]稳定婚姻 Tarjan
- Condition并发
- js 中的闭包
- Java线程:线程状态的转换
- 网易云配置ipv6
- iOS应用架构谈
- 彻底理解ThreadLocal
- Activiti简单学习心得一
- Icomoon插入图标方法②
- Notification的实现之设置通知音乐.setSound 2017.06.06