没有条件创造条件Condition

举报
西魏陶渊明 发表于 2022/09/25 02:57:14 2022/09/25
【摘要】 作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window) 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 https://blog.csdn.net/a1439775520/article/det...

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window)

西魏陶渊明

莫笑少年江湖梦,谁不少年梦江湖

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

运行结果

  • 当前线程进入线程一
  • 当前线程进入线程二
  • 当前线程释放main
  • 当前线程释放main
  • 当前线程退出线程一
  • 当前线程退出线程二

    
  1. /**
  2. * @author liuxin
  3. * 2022/1/5 12:24 上午
  4. */
  5. public class ObjectWait {
  6. public synchronized void objWait() throws Exception {
  7. System.out.println("当前线程进入" + Thread.currentThread().getName());
  8. wait();
  9. System.out.println("当前线程退出" + Thread.currentThread().getName());
  10. }
  11. public synchronized void objNotify() throws Exception {
  12. System.out.println("当前线程释放" + Thread.currentThread().getName());
  13. notify();
  14. }
  15. public static void main(String[] args) throws Exception {
  16. ObjectWait objectWait = new ObjectWait();
  17. // 使用synchronized修饰方法,就是锁的是当前这个示例synchronized(this)
  18. new Thread(() -> {
  19. try {
  20. // 当前进入等待,然后释放锁。wait会释放锁
  21. objectWait.objWait();
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. },"线程一").start();
  26. // 使用synchronized修饰方法,就是锁的是当前这个示例synchronized(this)
  27. new Thread(() -> {
  28. try {
  29. // 当前进入等待,然后释放锁。wait会释放锁
  30. objectWait.objWait();
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. },"线程二").start();
  35. Thread.sleep(1000L);
  36. // 释放锁后才会放行
  37. objectWait.objNotify();
  38. // 释放锁后才会放行
  39. objectWait.objNotify();
  40. }
  41. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

# LockWait

运行结果

  • 当前线程进入线程一
  • 当前线程进入线程二
  • 当前线程释放main
  • 当前线程释放main
  • 当前线程退出线程一
  • 当前线程退出线程二

    
  1. /**
  2. * @author liuxin
  3. * 2022/1/5 24:24 上午
  4. */
  5. public class LockWait {
  6. private ReentrantLock lock = new ReentrantLock();
  7. private Condition condition = lock.newCondition();
  8. public void lockWait() throws Exception {
  9. lock.lock();
  10. System.out.println("当前线程进入" + Thread.currentThread().getName());
  11. condition.await();
  12. System.out.println("当前线程退出" + Thread.currentThread().getName());
  13. lock.unlock();
  14. }
  15. public void lockNotify() {
  16. lock.lock();
  17. System.out.println("当前线程释放" + Thread.currentThread().getName());
  18. condition.signal();
  19. lock.unlock();
  20. }
  21. public static void main(String[] args) throws Exception {
  22. LockWait lockWait = new LockWait();
  23. // lock.lock() 线程一: 获取锁,然后wait之后,进入释放锁,然后进入到等待队列
  24. new Thread(() -> {
  25. try {
  26. // 当前进入等待,然后释放锁。
  27. lockWait.lockWait();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }, "线程一").start();
  32. // lock.lock() 当前线程二获取锁,然后wait之后,进入释放锁,然后进入到等待队列
  33. new Thread(() -> {
  34. try {
  35. // 当前进入等待,然后释放锁。
  36. lockWait.lockWait();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. },"线程二").start();
  41. Thread.sleep(1000L);
  42. // 调用第一次,会唤醒线程一,继续向下执行
  43. lockWait.lockNotify();
  44. // 调用第二次,会唤醒线程二,继续向下执行
  45. lockWait.lockNotify();
  46. }
  47. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858014

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。