没有条件创造条件Condition
Java进阶

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/
!!! tip 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 !!!
https://blog.csdn.net/a1439775520/article/details/98471610
Condition 是为了调换 Object 中的 wait() 和notify().
| API | Object | Condition |
|---|---|---|
| 等待 | wait() | wait() |
| 通知 | notify() | signal() |
| 通知所有 | notifyAll() | signalAll() |
wait是会释放锁
相同点
- 都必须被包裹在同步代码块中,即加锁
- 当调用wait都会释放锁
不同点
- Object 依赖 synchronized 锁
- Condition 依赖 Lock 锁
ObjectWait
!!! tip 运行结果
- 当前线程进入线程一
- 当前线程进入线程二
- 当前线程释放main
- 当前线程释放main
- 当前线程退出线程一
- 当前线程退出线程二 !!!
java
1/**
2 * @author liuxin
3 * 2022/1/5 12:24 上午
4 */
5public class ObjectWait {
6
7 public synchronized void objWait() throws Exception {
8 System.out.println("当前线程进入" + Thread.currentThread().getName());
9 wait();
10 System.out.println("当前线程退出" + Thread.currentThread().getName());
11 }
12
13 public synchronized void objNotify() throws Exception {
14 System.out.println("当前线程释放" + Thread.currentThread().getName());
15 notify();
16 }
17
18 public static void main(String[] args) throws Exception {
19 ObjectWait objectWait = new ObjectWait();
20 // 使用synchronized修饰方法,就是锁的是当前这个示例synchronized(this)
21 new Thread(() -> {
22 try {
23 // 当前进入等待,然后释放锁。wait会释放锁
24 objectWait.objWait();
25 } catch (Exception e) {
26 e.printStackTrace();
27 }
28 },"线程一").start();
29
30 // 使用synchronized修饰方法,就是锁的是当前这个示例synchronized(this)
31 new Thread(() -> {
32 try {
33 // 当前进入等待,然后释放锁。wait会释放锁
34 objectWait.objWait();
35 } catch (Exception e) {
36 e.printStackTrace();
37 }
38 },"线程二").start();
39 Thread.sleep(1000L);
40 // 释放锁后才会放行
41 objectWait.objNotify();
42 // 释放锁后才会放行
43 objectWait.objNotify();
44 }
45}
46LockWait
!!! tip 运行结果
- 当前线程进入线程一
- 当前线程进入线程二
- 当前线程释放main
- 当前线程释放main
- 当前线程退出线程一
- 当前线程退出线程二 !!!
java
1/**
2 * @author liuxin
3 * 2022/1/5 24:24 上午
4 */
5public class LockWait {
6
7 private ReentrantLock lock = new ReentrantLock();
8
9 private Condition condition = lock.newCondition();
10
11 public void lockWait() throws Exception {
12 lock.lock();
13 System.out.println("当前线程进入" + Thread.currentThread().getName());
14 condition.await();
15 System.out.println("当前线程退出" + Thread.currentThread().getName());
16 lock.unlock();
17 }
18
19 public void lockNotify() {
20 lock.lock();
21 System.out.println("当前线程释放" + Thread.currentThread().getName());
22 condition.signal();
23 lock.unlock();
24 }
25
26 public static void main(String[] args) throws Exception {
27 LockWait lockWait = new LockWait();
28 // lock.lock() 线程一: 获取锁,然后wait之后,进入释放锁,然后进入到等待队列
29 new Thread(() -> {
30 try {
31 // 当前进入等待,然后释放锁。
32 lockWait.lockWait();
33 } catch (Exception e) {
34 e.printStackTrace();
35 }
36 }, "线程一").start();
37 // lock.lock() 当前线程二获取锁,然后wait之后,进入释放锁,然后进入到等待队列
38 new Thread(() -> {
39 try {
40 // 当前进入等待,然后释放锁。
41 lockWait.lockWait();
42 } catch (Exception e) {
43 e.printStackTrace();
44 }
45 },"线程二").start();
46
47 Thread.sleep(1000L);
48 // 调用第一次,会唤醒线程一,继续向下执行
49 lockWait.lockNotify();
50 // 调用第二次,会唤醒线程二,继续向下执行
51 lockWait.lockNotify();
52 }
53}
54