JAVA多线程并发编程学习笔记3——显式锁

JAVA并发编程

5. 显式锁

5.1 Lock接口

5.1.1 概念
  • Lock接口提供了无条件的、可轮询的、定时的、可中断的锁获取操作
  • 加锁和解锁的方法都是显式的
  • 优点:可以中断等待获取锁的线程;可以不必无限等待锁
5.1.2 方法
方法返回值描述
lock()void申请锁,一直到锁可用
lockInterruptiblyvoid当前线程未被中断则申请锁,否则抛出异常
tryLock()boolean只在调用时申请锁
tryLock(long, TimeUnit)boolean在一段时间内申请锁
unlock()void释放锁
newCondition()Condition返回一个新Condition绑定到该实例Lock实例
5.1.3 使用规范
Lock lock = new ReentrantLock();
lock.lock();
try{
    //do something
} finally{
    lock.unlock();
}

5.2 ReentrantLock

5.2.1 概念
  • tryLock()实现了可定时的和可轮询的锁获取模式,可以避免死锁。

    (避免死锁:将不同锁的trylock()方法作为嵌套的if判断条件,即只有获得锁1才能获得锁2)

  • 在等待锁的过程中,程序可以取消对锁的请求(lockInterruptibly())。

5.2.2 Condition
  • newCondition()方法返回该锁的Condition对象,实现等待通知

  • 方法

    方法返回值描述
    await()void使线程等待并释放锁,知直到被通知或中断
    await(long, TimeUnit)boolean使线程等待一段时间内被通知、中断
    awaitUninterrputibly()void使线程等到被通知
    awaitUntil(Date)boolean使线程等待到某个时刻前被通知、中断
    signal()void通知唤醒一个等待线程
    signalAll()void通知唤醒所有等待线程
5.2.3 其他方法
方法返回值描述
isHeldByCurrentThread()boolean查询此锁是否由当前线程持有
isLocked()boolean查询此锁是否由任何线程持有
isFair()boolean查询是否为公平锁
5.2.4 公平性
  • 公平锁:公平锁会让新的请求线程加入等待队列,线程按照时间顺序获得锁。

  • 非公平锁:从阻塞队列中随机选择一个线程恢复,性能较高。

    synchronized是非公平锁,ReentrantLock默认是非公平锁。

5.3 ReentrantReadWriteLock

5.3.1 概念
  • ReentrantLock是互斥锁,同一时间只能被一个线程持有

  • ReadWriteLock接口允许多个线程同时读取,但不能同时读写或同时写。

  • ReentrantReadWriteLock实现了ReadWriteLock接口

5.3.2 接口方法
方法返回值描述
readLock()Lock返回读锁
writeLock()Lock返回写锁
5.2.3 实现
ReadWriteLock lock = new ReentrantReadWriteLock();
Lock r = lock.readLock();
Lock w = lock.writeLock();
r.lock();
try{
    // do something
} finally{
    r.unlock();
}
w.lock();
try{
    // do something
} finally{
    w.unlock();
}

6. 线程管理

6.1 线程组

6.2 线程异常

6.3 HOOK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值