共计 1454 个字符,预计需要花费 4 分钟才能阅读完成。
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();}
}
}
正文完