synchronized 公平还是非公平
时间: 2023-07-20 09:37:31 浏览: 75
synchronized 关键字既可以使用非公平锁,也可以使用公平锁。非公平锁是默认的选择,它并不保证线程获取锁的顺序。而公平锁则保证线程获取锁的顺序是按照请求锁的顺序来的。在 Java 中,可以通过在 synchronized 关键字后面添加 "fair" 关键字来获取公平锁。例如:
```
synchronized (obj) {
// 非公平锁
}
synchronized fair(obj) {
// 公平锁
}
```
相关问题
synchronized 非公平锁
synchronized关键字在默认情况下是非公平锁。非公平锁指的是当多个线程竞争同一个锁时,锁的获取是不按照线程的请求顺序进行的,而是由操作系统的调度决定的。这意味着,即使一个线程已经等待了很长时间,也不能保证它会优先获得锁。[1]
需要注意的是,synchronized关键字也可以使用公平锁。公平锁指的是当多个线程竞争同一个锁时,锁的获取是按照线程的请求顺序进行的,先到先得。在synchronized关键字中使用公平锁需要在获取锁的地方添加一个参数,即synchronized关键字后面的括号中加上"true"。例如:synchronized(obj, true)。[1]
总结来说,synchronized关键字默认情况下是非公平锁,但也可以使用公平锁。非公平锁的获取顺序由操作系统的调度决定,而公平锁的获取顺序是按照线程的请求顺序进行的。[1]
ReentrantLock支持公平锁和非公平锁,而synchronized只支持非公平锁对吗
ReentrantLock 可以同时提供公平锁和非公平锁两种机制,这是它的一个特性。公平锁意味着获取锁的线程按照它们请求锁的顺序排队,先等待的线程会优先获得锁。而非公平锁则不保证这种顺序,新来的线程可能会立即抢占锁,即使前面还有线程在等待。
相比之下,Java 中的 synchronized 关键字实际上也隐含了一种非公平的行为,因为它是基于“先进先出”(FIFO)原则工作的,新请求锁的线程会尝试立即获取,而不是等待当前持有锁的线程释放。所以,虽然 synchronized 提供了锁定机制,但它并不直接支持公平和非公平的选择。
阅读全文