一提并发绝对离不开锁,生活中锁有好几种,比如钢丝锁,U形锁,不同的门锁,java中的锁也是一样,他们锁的有型有色,各有千秋。
下面就讲讲一种新锁,他叫做ReentrantLock,还是带着问题去解读
1. 与 synchronized 相比较有什么不同
官方解答它比synchronized更加灵活、强大、增加了轮询、超时、中断等高级功能以及可以创建公平和非公平锁。意思就是更加牛逼。
synchronized 是jvm层面的而ReentrantLock是jdk层面的,因为他的试下是通过jdk来实现的
看下代码
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
这个是他的构造方法可以创建公平锁和非公平锁,继续
static final class FairSync extends Sync
他继承了Sync类再继续
abstract static class Sync extends AbstractQueuedSynchronizer
他又继承了
AbstractQueuedSynchronizer
也就是Aqs,这些都是代码中处理了所以他是jdk来实现的,用了代码实现证明他要整事。
- ReentrantLock 与 Lock 的关系
ReentrantLock 是基于 Lock 实现的可重入锁,所有的 Lock 都是基于 AQS 实现的
- 锁过程中是否可中断,与之对应的 synchronized 可中断吗
ReentrantLock是可重入锁,它里面的lockInterruptibly()方法使得线程可以在被阻塞时响应中断,比如一个线程t1通过lockInterruptibly()方法获取到一个可重入锁,并执行一个长时间的任务,另一个线程通过interrupt()方法就可以立刻打断t1线程的执行,来获取t1持有的那个可重入锁。
网友评论