多线程中使用 Lock 接口的两个实现类 ReentrantLock 和 ReentrantReadWriteLock 实现线程锁

本文介绍了Java中的ReentrantLock和ReentrantReadWriteLock,它们分别实现了Lock接口和ReadWriteLock接口。ReentrantLock是独占锁,提供公平与非公平的选择,而ReentrantReadWriteLock允许多个读取线程并发,但写锁是独占的。两者都支持可重入特性,并且ReentrantReadWriteLock允许写锁降级。Condition接口提供了比Object的wait/notify更细粒度、更高效率的线程通信方式。文章还给出了使用示例。
摘要由CSDN通过智能技术生成

参考博客:Java中ReentrantLock的使用(CSDN)

参考博客:Java并发编程之ReentrantReadWriteLock详解(CSDN)

参考博客:ReentrantReadWriteLock读写锁详解(博客园)

参考博客:ReentrantReadWriteLock读写锁详解(知乎)

ReentrantLock 可重入锁实现了 Lock 接口,是一种独占锁。公平与否取决于构造函数。

ReentrantReadWriteLock 可重入锁实现了 ReadWriteLock 接口,ReentrantReadWriteLock 读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。公平与否取决于构造函数。

ReentrantReadWriteLock 中有两个内部静态类 ReadLock 和 WriteLock,他们都实现了Lock接口。

Lock接口中的方法:

    // 不可中断的方式获得锁,获得锁后线程继续执行,否则阻塞,无法被interrput()方法中断。
    void lock();
	
    // 可中断的方式获得锁,获得锁后线程继续执行,否则阻塞,可以被interrput()方法中断。
    void lockInterruptibly() throws InterruptedException;

    // 尝试获得锁,获得锁以后返回ture,获取锁失败返回false。
    boolean tryLock();

    // 尝试获得锁,获得锁以后返回ture,超时以后返回false。
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    // 释放锁。
    void unlock();
	
    // 创建Condition,用于多线程间通信。
    Condition newCondition();

ReentrantLock中除实现Lock接口外的一些其他方法:

    // 构造函数,创建一个非公平锁。
    ReentrantLock() 

    // 构造函数,fair = true:创建一个公平锁;fair = false:创建一个非公平锁。
    ReentrantLock(boolean fair) 
    
    // 查看正在抢锁的线程数量。
    int getQueueLength()
	
    // 是否有线程正在抢锁。
    boolean hasQueuedThreads()
	
    // 指定的线程是否在抢锁。
    boolean hasQueuedThread(Thread thread)
	
    // 当前线程是否抢到锁。返回0代表没有。
    int getHoldCount()
	
    // 当前是否有某个线程占有锁。
    boolean isLocked()
	 
    // 是否为公平锁
    boolean isFair() 
	

ReentrantLock.Condition是在粒度和性能上都优于Object的notify()、wait()、notifyAll()线程通信的方式。
Condition中通信方法相对Object的通信在粒度上是粒度更细化,表现在一个Lock对象上引入多个Condition监视器、通信方法中除了和Object对应的三个基本函数外,更是新增了线程中断、阻塞超时的函数;
Condition中通信方法相对Object的通信在性能上更高效,性能的优化表现在ReentrantLock比较synchronized的优化 ;
注意在使用Condition的await()、signal()、signalAll()方法时不能和Object的wait()、notify()、notifyAll()混用,否则抛出IllegalMonitorStateException;

Condition接口中的一些方法:

    // 当前线程进入阻塞状态,允许其他线程抢占当前线程持有的lock锁。
    // 可以被interrupt()方法中断,抛出InterruptedException异常,捕获异常后线程继续执行。
    // 可以被signal()方法或者signalAll()方法唤醒,线程继续执行。
    void await() throws InterruptedException;

    // 当前线程进入阻塞状态,允许其他线程抢占当前线程持有的lock锁。
    // 不可以被interrupt()方法中断。
    // 可以被signal()方法或者signalAll()方法唤醒,线程继续执行。
    void awaitUninterruptibly();

    // 当前线程进入阻塞状态&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值