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默认是非公平锁,公平锁是浪费性能的。

  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/6494997.html
Copyright © 2011-2022 走看看