项目概况

没有条件创造条件Condition

2026-01-292 min read后端技术
Java进阶

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/

!!! tip 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 !!!

https://blog.csdn.net/a1439775520/article/details/98471610

Condition 是为了调换 Object 中的 wait() 和notify().

APIObjectCondition
等待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} 46

LockWait

!!! 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