javaaqs如何支持不公平锁?
在AQS的说明中,第一行说 提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等) 由于AQS是基于FIFO等待队列的,我认为这自然是公平的。但是在javaaqs如何支持不公平锁?,java,multithreading,Java,Multithreading,在AQS的说明中,第一行说 提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等) 由于AQS是基于FIFO等待队列的,我认为这自然是公平的。但是在Samephore和ReentrantLock等许多地方的实现中,既有公平的AQS版本,也有不公平的AQS版本 所以我想知道AQS是如何支持不公平锁的 还有,我在文件里找到了这些行。但我不明白。一个线程如何领先于已经在队列中的其他线程 即使此类基于内部FIFO队列,它也不会自动强制执行>FIFO采集策略。独占同步
Samephore
和ReentrantLock
等许多地方的实现中,既有公平的AQS版本,也有不公平的AQS版本
所以我想知道AQS是如何支持不公平锁的
还有,我在文件里找到了这些行。但我不明白。一个线程如何领先于已经在队列中的其他线程
即使此类基于内部FIFO队列,它也不会自动强制执行>FIFO采集策略。独占同步的核心采用以下形式:
获得:
而(!tryAcquire(arg)){
使线程排队(如果尚未排队);
可能阻塞当前线程;
}
发布:
if(tryRelease(arg))
解除对第一个排队线程的阻塞
(共享模式类似,但可能涉及级联信号。)
因为acquire中的检查是在排队之前调用的,所以新的获取线程可能会中断
在被阻止和排队的其他人之前
一个线程如何领先于已经在队列中的其他线程?
在不公平模式下,新线程将尝试首先获取锁。如果失败,则会将其插入队列
例如:
请您在代码中指出步骤4是如何发生的。在公平模式下,新线程必须在队列中等待。在不公平模式下,当您调用
lock
方法时,即使队列中有其他线程等待,新线程也会尝试获取锁,并且只有在无法获取锁时才会将其插入队列。