(11)重入锁

重入锁使用的是 ReentrantLock 类。

说明

重入锁代码

ReentrantLock lock = new ReentrantLock();
lock.lock();
//其他代码
lock.unlock();

在退出临界区的时候,必须释放锁,否则,其他线程就没有机会再访问临界区了。在同一个线程中,重入锁可以反复进入,一个线程连续两次获取同一把锁,是可以的,但是也得同时释放两次锁。

中断

lockInterruptibly() 该方法,获取锁时,其他线程已经获取锁,则进入等待,等待过程可以响应中断。

锁申请等待限时

tryLock() 不进行等待,获取锁,获取成功返回 true,失败则返回 false。
tryLock(long timeout, TimeUnit unit) 立即获取锁,则返回true,如果所被其他线程获取,则进行等待,等待指定时间,如果还未获取,则返回 false。

公平锁

构造方法 ReentrantLock(boolean fair) 中有个 fair ,如果为 true 则表示为公平锁。默认是 false 。公平锁必然要求系统维护一个有序队列,因此公平锁的实现成本比较高。

方法

方法名返回值说明
lock()void获得锁,不会响应中断。
unlock()void释放锁。
lockInterruptibly()void获得锁,可响应中断,会抛出 InterruptedException 异常。
tryLock()boolean获得放锁,如果获得成功,返回 true,获得失败,返回 false
tryLock(long timeout, TimeUnit unit)boolean指定时间内等待获得放锁,如果获得成功,返回 true,获得失败,返回 false。timeout 为等待的时间长度,TimeUnit为等待时间长度的单位。
isHeldByCurrentThread()boolean查询当前线程是否持有锁,true表示持有,false表示未持有。

Condition

Condition 对象和 wait()notify() 方法的作用是大致相同的。但是 wait()notify() 方法是和 synchronized 关键字合作使用的,而 Conditon 是与重入锁相关联的。

方法

方法名返回值说明
await()void会使当前线程等待,并释放锁,当其他线程中使用 signal 或者 signalAll方法时,线程会重新获得锁并继续执行。
await(long time, TimeUnit unit)boolean使当前线程等待直到发出信号或中断,或指定的等待时间过去。
awaitNanos(long nanosTimeout)long使当前线程等待直到发出信号或中断,或指定的等待时间过去。
awaitUninterruptibly()void与 await 方法基本相同,但是它不会再等待过程中响应中断。
awaitUntil(Date deadline)boolean使当前线程等待直到发出信号或中断,或者指定的最后期限过去。
signal()void用于唤醒一个等待中的线程。
signalAll()void唤醒所有在等待中的线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值