Condition的认知
- 在应用Lock之前,咱们应用的最多的同步形式应该是synchronized关键字来实现同步形式了。配合Object的wait()、notify()系列办法能够实现期待/告诉模式。
Condition接口
也提供了相似Object的监视器办法,与Lock配合能够实现期待/告诉模式,然而这两者在应用形式以及性能个性上还是有差异的。Object和Condition接口的一些比照。摘自《Java并发编程的艺术》
Condition接口的介绍与示例
首先咱们须要明确condition对象是依赖于lock对象的,意思就是说condition对象须要通过lock对象进行创立进去(调用Lock对象的newCondition()办法)。condition的应用形式十分的简略。然而须要留神在调用办法前获取锁。
调用示例
/** * condition应用示例: * 1、condition的应用必须要配合锁应用,调用办法时必须要获取锁 * 2、condition的创立依赖于Lock lock.newCondition(); */ public class ConditionUseCase { /** * 创立锁 */ public Lock readLock = new ReentrantLock(); /** * 创立条件 */ public Condition condition = readLock.newCondition(); public static void main(String[] args) { ConditionUseCase useCase = new ConditionUseCase(); ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.execute(() -> { //获取锁进行期待 useCase.conditionWait(); }); executorService.execute(() -> { //获取锁进行唤起读锁 useCase.conditionSignal(); }); } /** * 期待线程 */ public void conditionWait() { readLock.lock(); try { System.out.println(Thread.currentThread().getName() + "拿到锁了"); System.out.println(Thread.currentThread().getName() + "期待信号"); condition.await(); System.out.println(Thread.currentThread().getName() + "拿到信号"); } catch (Exception e) { } finally { readLock.unlock(); } } /** * 唤起线程 */ public void conditionSignal() { readLock.lock(); try { //睡眠5s 线程1启动 Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + "拿到锁了"); condition.signal(); System.out.println(Thread.currentThread().getName() + "发出信号"); } catch (Exception e) { } finally { //开释锁 readLock.unlock(); } }}