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();
}
}
}
发表回复