java中的wait、notify

最近在学习java多线程的锁相关的知识,通过不断百度别人对wait、notify的理解,我也有了一些的认识。同时之所以写这篇博客,我也是发现网上大多写的是wait、notify的用法、规则、注意事项、描述性比较专业、太技术化。这对于初学都来说容易陷入一脸懵逼的状态,很快可能就想放弃。而我今天描述则重在剖析wait、notify存在的意义,而不是让初学都陷入一种被动接受规则的境地,只有这样才能弄清楚这种机制存在的意义,才能在实际开发中更好灵活应用。

以下是剖析:

java中的wait与notify机制其实是为了使锁资源的竞争相对来说更可调控而存在的。

诚然同步锁已经可以保证共享资源可以同步进行使用,但是锁资源的竞争是系统调度的,有一定随机性。如果可以让线程获取锁资源有一定的协同性,这样在一定情况下可以提高线程对锁资源利用的有效率,也会避免饥饿锁。所谓饥饿锁就是拿到锁以后发现资源并没有准备好,然后释放锁,而这样的线程一旦比较多,准备资源的线程却比较少,准备资源的线程相对来说获取锁的概率就比较小,这样CPU资源可能大部分尽浪费在不断检查资源的线程上,显然是无意义的。总的来说,就是如何实现锁竞争的相对公平性,进而合理利用CPU资源?

而解决上面问题的核心就是灵活运用wait与notify机制,wait时,线程会主动放弃争夺锁资源,它会首先释放锁,挂起当前线程,然后进入等待池。等待池里的线程是不会去参与锁资源的竞争,越来越多的线程进入等待池,而锁池里竞争锁的线程压力就会减少,这样就给准备资源的线程有更多的机会获取锁,等到它准备好资源后,它会通知等待池里的线程进入锁池竞争锁资源,如此一来线程之间实现了很好的协同,当然比较重要的是线程间要遵守wait与notify这样的契约,这样大家才能更高效的利用好昂贵的锁资源。

其实java后面的版本也已经用编程加数据结构加算法的方式灵活的实现了一些锁,将锁的应用概念高度抽象化,而我们不再需要直面wait与notify,可以让编写并发程序更直观的面向锁化。它使锁的获取可以达到相对意义上的公平,同时也把锁扩展到了共享层面,不再是一味的独占,在某些场景灵活运用可以提高系统吞吐量。

好了本文重在剖析机制存在的意义,不会去教你实操,同时我也相信如果你能深入理解wait、nofity的意义,你也一定能合理运用它解决一些实际应用的难题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值