26-java.util.concurrent.locks包分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84769482
  1. java.util.concurrent.locks包分析
    1. 类关系图

    1. Lock接口分析
      1. 优点

tryLock():允许在一定的时间内来获取锁,获取失败则返回false,这样线程可以执行其它的操作,而不至于使线程进入休眠(synchronized获取失败则进入阻塞队列中等待)。

ReentrantReadWriteLock:提供了读锁和写锁,允许多个线程获得读锁、而只能有一个线程获得写锁。

锁的获取和释放可以在不同的代码块、不同的方法中。且当获取了多个锁时,允许以任何顺序获取和释放多个锁。

      1. 发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象
      2. 方法

获取

void

lock()

获取锁。如果锁已被其他线程获取,则进行等待。

发生异常时,不会自动释放锁,需在finally中去释放锁

void

lockInterruptibly()

扫描二维码关注公众号,回复: 4559419 查看本文章

+ 等待获取锁的过程,可被B.interrupt()中断

发生异常时,不会自动释放锁,需在finally中去释放锁

boolean

tryLock()

tryLock(long,TimeUnit)

在给定时间内获取锁,获取失败则返回false

发生异常时,不会自动释放锁,需在finally中去释放锁

释放

void

unlock()

释放锁,通常在finally中释放

必须在获取锁成功的情况下才能释放,IllegalMonitorStateException

其他

Condition

newCondition()

返回绑定到此 Lock 实例的新 Condition 实例。

 

    1. Condition接口分析
      1. 特点

条件队列,相当于synchronized(obj)中的对象监视器obj。但是synchronized只能提供一个对象锁。而Lock.newCondition(),可以获取对应锁上的多个条件队列。

      1. 方法

await():造成当前线程在接到信号或被中断之前一直处于等待状态。

await(long time, TimeUnit unit):成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。

signal():唤醒一个等待线程。

signalAll():唤醒所有等待线程。

    1. ReadWriteLock接口分析
      1. 特点

ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。

      1. 方法

Lock:readLock():返回用于读取操作的锁。

Lock:writeLock() :返回用于写入操作的锁。

 

    1. ReentrantReadWriteLock案例分析
  1. 逻辑

  1. 执行结果

写写,写读相互独立。读读可并行

 

    1. ReentrantLock 可重入的互斥锁
      1. 构造方法

Lock lock = new ReentrantLock(); 默认为非公平锁

Lock lock = new ReentrantLock(true); 非公平锁

公平锁模式下,一般而言,等待时间最久的线程(最先请求的线程)会获得该锁。而在非公平锁例下,则无法保证锁的获取是按照请求锁的顺序进行的。

      1. 常用方法

lock锁是不是公平锁:lock.isFair()

当前线程获取到lock锁的次数:lock.getHoldCount()

等待获取lock锁的线程个数:lock.getQueueLength()

线程t是否在等待获取锁lock:lock.hasQueuedThread(t)

是否有线程在等待获取锁lock:lock.hasQueuedThreads()

当前线程是否持有锁lock:lock.isHeldByCurrentThread()

锁lock是不是被任意线程持有中:lock.isLocked()

      1. 使用案例:生产消费者模型
  • 客户端:

  • 生产者线程

  • 消费者线程

多线程学习大纲:https://mp.csdn.net/postedit/84768644

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84769482