zoukankan      html  css  js  c++  java
  • 并发编程过程中的重入锁

    ReentrantLock(重入锁)

    重入锁:在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定,不然会造成锁永远无法释放,其他线程永远进不来的结果。

    然后我们看一下打印的结果:

    只有在第一个方法结束后,才会去执行第二个方法。

    这种用法跟synchronized的用法差不多,还记得我们在使用synchronized的时候,如果需要多线程间进行协作工作,则需要Object的wait()和notify()、notifyAll()方法进行配合工作。

    那么同样,我们在使用Lock的时候,可以使用一个新的等待/通知的类,它就是Condition。这个Condition一定是针对具体某一把锁的。也就是在只有锁的基础之上才会产生Condition。

    看一个demo:

    下面看一下结果,

     

    这个我们以前是怎么去实现的呢?就是sync配合wait和notify去实现的,操作比较繁琐,就演化出了现在的这种实现方式。

    Condition的优点:

      我们可以通过一个Lock对象产生多个Condition进行多线程间的交互,非常的灵活。可以使得部分需要唤醒的线程唤醒,其他线程则继续等待通知。

      我们同样看一个demo:这段demo代码比较长,但是代码很简单。

    同样看一下打印的结果:

    可以看的出来,唤醒或者等待都是相对于Condition对象的。

    最后在看一下Lock/Condition其他方法和用法:

    公平锁和非公平锁:

    Lock lock = new ReentrantLock(boolean isFair);

    lock用法:

    tryLock():尝试获得锁,获得结果用true/false返回。

    tryLock():在给定的时间内尝试获得锁,获得结果用true/false返回。

    isFair():是否是公平锁。

    isLocked():是否锁定。

    getHoldCount():查询当前线程保持此锁的个数,也就是调用lock()次数。

    lockInterruptibly():优先响应中断的锁。

    getQueueLength():返回正在等待获取此锁定的线程数

    getWaitQueueLength():返回等待与锁定相关的给定条件Condition的线程数。

    hasQueuedThread(Thread thread):查询指定的线程是否正在等待此锁。

    hasQueuedThreads():查询是否有线程正在等待此锁。

    hasWaiters():查询是否有线程正在等待与此锁定有关的condition条件。

    ReentrantLock默认是非公平锁,公平锁是浪费性能的。

  • 相关阅读:
    Linux常用指令
    【OOM】记录一次生产上的OutOfMemory解决过程
    (转载)springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)
    【Idea】实用插件列表
    【工厂模式】-企业微信应用配置代码优化
    【日志追踪】(微服务应用和单体应用)-logback中的MDC机制
    行内元素进行绝对(absolute),固定(fixed)定位后会变成块级元素·
    JQuery
    单行文字居中
    后代元素 span:first-child{...}
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/6494997.html
Copyright © 2011-2022 走看看