type
status
date
slug
summary
tags
category
icon
password
Property
使用
ReentrantLock
比直接使用synchronized
更安全,可以替代synchronized
进行线程同步。但是,
synchronized
可以配合wait
和notify
实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock
我们怎么编写wait
和notify
的功能呢?答案是使用
Condition
对象来实现wait
和notify
的功能。我们仍然以
TaskQueue
为例,把前面用synchronized
实现的功能通过ReentrantLock
和Condition
来实现:可见,使用
Condition
时,引用的Condition
对象必须从Lock
实例的newCondition()
返回,这样才能获得一个绑定了Lock
实例的Condition
实例。Condition
提供的await()
、signal()
、signalAll()
原理和synchronized
锁对象的wait()
、notify()
、notifyAll()
是一致的,并且其行为也是一样的:await()
会释放当前锁,进入等待状态;
signal()
会唤醒某个等待线程;
signalAll()
会唤醒所有等待线程;
- 唤醒线程从
await()
返回后需要重新获得锁。
此外,和
tryLock()
类似,await()
可以在等待指定时间后,如果还没有被其他线程通过signal()
或signalAll()
唤醒,可以自己醒来:可见,使用
Condition
配合Lock
,我们可以实现更灵活的线程同步。小结
Condition
可以替代wait
和notify
;Condition
对象必须从Lock
对象获取。