【J.U.C】lockInterruptibly与lock
引言
在看LinkedBlockingQueue源码时,发现一点疑惑:
poll(long timeout, TimeUnit unit)方法中通过takeLock.lockInterruptibly()获取锁,
其重载方法poll()中,通过takeLock.lock()获取锁。
通过查看ReentrantLock源码中lockInterruptibly()与lock()方法,解决上述问题。
lock()
lock()调用了抽象类Sync(实现了AQS)的lock()方法,这是一个抽象方法,有两个实现,一个公平锁,一个非公平锁,最终都调用到acquire(int arg)方法,内部处理了中断。
优先考虑获取锁,待获取锁成功后,才响应中断。
1 | /** |
lockInterruptibly()
每个线程存在interrupted status,当线程在sleep或wait,join,此时如果别的线程调用此线程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;
如果此线程在运行中,则不会收到提醒。但是此线程的 interrupted status 会被设置,可以通过isInterrupted()查看并作出处理。
lockInterruptibly()方法调用了isInterrupted()方法,如果发现已经被中断,则抛出InterruptedException。
lockInterruptibly()优先考虑响应中断,再去获取锁。
1 | /** |
poll(long timeout, TimeUnit unit)方法设计成了多少时间没有获取到锁后,返回,优先相应中断比较合适,
poll()设计成了非阻塞的方法,获取不到直接返回。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!