由两个因素共同作用,导致该情况的产生:首先是使用了无参构造函数new ReentrantLock(),默认是非公平锁(就是尽管已经有线程在排队了,但是依然可以插队)第二点是在unlock()之后立即调用lock()方法,这里面的时间间隔很短,而unlock()方法调用并返回后,等待的线程刚被唤醒,此时可能还在准备调度阶段(还没分配到CPU时间片),这时线程1又继续调用lock()方法,完成插队动作`那么显然解决方法有两种:使用有参构造函数的公平锁,使其不允许插队依然使用非公平锁,但是在unlock()之后睡眠一小段时间,比如Thread.sleep(100)
由两个因素共同作用,导致该情况的产生:
非公平锁
(就是尽管已经有线程在排队了,但是依然可以插队
)立即
调用lock()方法,这里面的时间间隔很短,而unlock()方法调用并返回后,等待的线程刚被唤醒,此时可能还在准备调度阶段(还没分配到CPU时间片),这时线程1又继续调用lock()方法,完成插队动作`那么显然解决方法有两种: