多线程Lock的问题,实现多个线程能拿到票,票并且是连续的

如下图所示,为什么在循环里释放了锁还总是只能线程1拿到锁?
image.png

阅读 1k
1 个回答

由两个因素共同作用,导致该情况的产生:

  1. 首先是使用了无参构造函数new ReentrantLock(),默认是非公平锁(就是尽管已经有线程在排队了,但是依然可以插队
  2. 第二点是在unlock()之后立即调用lock()方法,这里面的时间间隔很短,而unlock()方法调用并返回后,等待的线程刚被唤醒,此时可能还在准备调度阶段(还没分配到CPU时间片),这时线程1又继续调用lock()方法,完成插队动作`

那么显然解决方法有两种:

  1. 使用有参构造函数的公平锁,使其不允许插队
  2. 依然使用非公平锁,但是在unlock()之后睡眠一小段时间,比如Thread.sleep(100)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题