【518、在 AQS 队列里,抢占锁是按照队列顺序吗?默认是什么锁?】

152 阅读1分钟

在 AQS 的队列中,抢占锁是按照队列顺序来的,也就是先入队的线程先进行获取锁的操作。

默认情况下,AQS 实现的是一个非公平锁。当有多个线程同时争抢锁时,锁的获取是不公平的,不是按照线程请求锁的顺序来分配锁的,而是直接由操作系统分配锁的拥有权。这样会导致某些线程一直无法获取到锁,而其他线程可以一直占用锁,这就是所谓的“饥饿”问题。但是非公平锁的并发性能相对于公平锁要高一些。

如果需要实现公平锁,可以在创建 ReentrantLock 对象时指定 fair 参数为 true,这样锁的获取会按照线程请求锁的顺序进行分配,但并发性能相对会降低一些。