一个奇怪的rwlock锁卡住的case

遇到一个case,有关于读写锁。原因路径如下:

  1. 线上有一个datanode节点宕机,导致与此节点的连接出现问题。
  2. 有hdfs客户端进程在处理此连接超时部分的代码有问题,没有将外层的超市传入至底层socket里,出问题的线程持有了无法超市推出,一直hang住,此线程还持有了一个读写锁的读锁。
  3. 由于内部某些机制另一个线程需要写锁,同时此锁的读锁会不停有人由于请求需要拿到和释放。
  4. 这时候出现了其他线程的读锁也无法获取到。

从线程栈看,就是一个线程获取了读锁,阻塞了别的线程获取读锁和写锁。

还原现场例子代码地址:https://github.com/liubinbin/sta/tree/master/rwlock/src/rwlock

1
看看ReentrantReadWriteLock,注意构造函数里可以传一个布尔值,区分公平锁和非公平锁。

NonfairSync和FairSync分别是两种实现,其中都实现了readerShouldBlock方法。这问题分两种情况:

  1. 公平锁:这种情况下对AQS的请求是需要安装时间顺序,如果新来的读请求在写请求之后就需要等待。
  2. 非公平锁:为了防止写请求饥饿,读请求会先判断等待队列头是否是写请求,所以在这种情况下,写请求会隔离读锁和读锁。

此问题最后解决办法是让那个出问题的读锁尽快的释放,不要一直占着读锁就可以把影响降低。