synchronized 公平还是非公平
时间: 2023-07-20 15:37:31 浏览: 204
synchronized 默认是非公平锁,也就是说,当多个线程尝试获取锁时,系统不保证按照先后顺序获取锁。这种情况下,如果一个线程在等待锁时一直没有获取到,那么它可能会在后面的某个时间突然获取到锁,即使有其他线程在等待锁的情况下。
如果需要使用公平锁,可以在 synchronized 关键字后面添加一个参数,将其设置为 true,如下所示:
```java
synchronized(lock, true) {
// 代码块
}
```
这样就可以保证多个线程获取锁的顺序按照它们等待的顺序来进行,即先等待的线程先获取到锁。但是,使用公平锁会影响程序的性能,因为要维护一个等待队列来保证公平性。因此,需要根据具体的情况来决定是否使用公平锁。
相关问题
synchronized 非公平锁
synchronized关键字在默认情况下是非公平锁。非公平锁指的是当多个线程竞争同一个锁时,锁的获取是不按照线程的请求顺序进行的,而是由操作系统的调度决定的。这意味着,即使一个线程已经等待了很长时间,也不能保证它会优先获得锁。[1]
需要注意的是,synchronized关键字也可以使用公平锁。公平锁指的是当多个线程竞争同一个锁时,锁的获取是按照线程的请求顺序进行的,先到先得。在synchronized关键字中使用公平锁需要在获取锁的地方添加一个参数,即synchronized关键字后面的括号中加上"true"。例如:synchronized(obj, true)。[1]
总结来说,synchronized关键字默认情况下是非公平锁,但也可以使用公平锁。非公平锁的获取顺序由操作系统的调度决定,而公平锁的获取顺序是按照线程的请求顺序进行的。[1]
synchronized是不是公平锁
synchronized 关键字在 Java 中用于实现线程同步,但它并不是公平锁。公平锁是指线程按照其请求的顺序来获取锁,而 synchronized 并不保证线程获取锁的顺序。在使用 synchronized 关键字时,如果多个线程同时请求锁,那么只有一个线程能够获取到锁,其他线程则进入阻塞状态。当释放锁后,其他线程会竞争获取锁,但具体哪个线程能够获取到是不确定的,可能是之前等待时间较短的线程,也可能是较长的线程。因此,synchronized 不是公平锁。要实现公平锁,可以使用 ReentrantLock 的构造函数参数设置为 true。
阅读全文