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

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


回答:

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

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

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

  1. 使用有参构造函数的公平锁,使其不允许插队
  2. 依然使用非公平锁,但是在unlock()之后睡眠一小段时间,比如Thread.sleep(100)

以上是 多线程Lock的问题,实现多个线程能拿到票,票并且是连续的 的全部内容, 来源链接: utcz.com/p/944552.html

回到顶部