javaaqs如何支持不公平锁?

javaaqs如何支持不公平锁?,java,multithreading,Java,Multithreading,在AQS的说明中,第一行说 提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等) 由于AQS是基于FIFO等待队列的,我认为这自然是公平的。但是在Samephore和ReentrantLock等许多地方的实现中,既有公平的AQS版本,也有不公平的AQS版本 所以我想知道AQS是如何支持不公平锁的 还有,我在文件里找到了这些行。但我不明白。一个线程如何领先于已经在队列中的其他线程 即使此类基于内部FIFO队列,它也不会自动强制执行>FIFO采集策略。独占同步

在AQS的说明中,第一行说

提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)

由于AQS是基于FIFO等待队列的,我认为这自然是公平的。但是在
Samephore
ReentrantLock
等许多地方的实现中,既有公平的AQS版本,也有不公平的AQS版本

所以我想知道AQS是如何支持不公平锁的

还有,我在文件里找到了这些行。但我不明白。一个线程如何领先于已经在队列中的其他线程

即使此类基于内部FIFO队列,它也不会自动强制执行>FIFO采集策略。独占同步的核心采用以下形式:

获得: 而(!tryAcquire(arg)){ 使线程排队(如果尚未排队); 可能阻塞当前线程; }

发布: if(tryRelease(arg)) 解除对第一个排队线程的阻塞

(共享模式类似,但可能涉及级联信号。) 因为acquire中的检查是在排队之前调用的,所以新的获取线程可能会中断 在被阻止和排队的其他人之前


一个线程如何领先于已经在队列中的其他线程?

在不公平模式下,新线程将尝试首先获取锁。如果失败,则会将其插入队列

例如:

  • Thread1持有锁

  • Thread2在队列中等待

  • 线程1释放锁

  • 几乎在同一时间,Thread3尝试获取锁。在不公平模式下运行时,允许Thread3在通知Thread2之前获取锁。但在公平模式下,Thread3将不被允许

  • 螺纹3释放锁

  • Thread2获得锁


  • 请您在代码中指出步骤4是如何发生的。在公平模式下,新线程必须在队列中等待。在不公平模式下,当您调用
    lock
    方法时,即使队列中有其他线程等待,新线程也会尝试获取锁,并且只有在无法获取锁时才会将其插入队列。