jdk1.5并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,关于两者区别,java并发编程实践里面有解释
公平锁: Threads acquire a fair
lock in the order in which they requested it
非公平锁:a nonfair
lock permits barging: threads requesting a lock can jump ahead of the queue
of waiting threads if the lock happens to be available when it is requested.
公平锁,就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己
非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式
protected
final
boolean
tryAcquire(
int
acquires) {
|
final
Thread current = Thread.currentThread();
|
compareAndSetState(
0
, acquires)) {
|
setExclusiveOwnerThread(current);
|
else
if
(current == getExclusiveOwnerThread()) {
|
int
nextc = c + acquires;
|
throw
new
Error(
"Maximum lock count exceeded"
);
|
}
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
//如果当前没有线程占有锁,当前线程直接通过cas指令占有锁,管他等待队列,就算自己排在队尾也是这样
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
分享到:
相关推荐
"公平锁&非公平锁" 公平锁(Fair Lock)和非...公平锁和非公平锁都是 ReentrantLock 的实现方式,前者能够避免饥饿现象的发生,而后者可能会导致饥饿现象的发生。开发者可以根据实际情况选择使用公平锁或非公平锁。
在Java中,ReentrantLock(可重入锁)是Lock接口的主要实现,它支持公平锁和非公平锁策略。公平锁保证按照线程请求锁的顺序进行分配,而非公平锁则不保证这一点,但通常效率更高。 条件变量(Condition)是Lock的一...
Java线程公平锁与非公平锁是并发编程中重要的概念,尤其在使用ReentrantLock时。ReentrantLock是Java并发包(java.util.concurrent)中的一个可重入互斥锁,它提供了比内置的synchronized关键字更为灵活的锁操作。 ...
本文将深入探讨C#中如何使用Lock和Redis分布式锁来解决并发问题,以秒杀系统为例进行阐述。 首先,让我们理解什么是并发控制。并发控制是指在多线程环境下确保数据的一致性和完整性,防止多个线程同时访问同一资源...
Java中的`ReentrantLock`就是一种阻塞锁,它支持公平锁和非公平锁模式。 阻塞队列是线程间的另一种通信方式,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们在`java.util.concurrent`包下。阻塞队列在生产...
- **Lock接口与ReentrantLock** 提供了比`synchronized`更细粒度的锁控制,可以实现公平锁和非公平锁,以及可中断和可重入的特性。 4. **并发设计模式** - **生产者-消费者模式** 使用队列作为缓冲区,一个线程...
本篇文章将深入解析ReentrantLock的源码,重点讨论非公平锁和公平锁的获取过程。 1. **ReentrantLock的基本概念** ReentrantLock是由Java提供的可重入互斥锁,支持公平锁和非公平锁两种模式。非公平锁的特性是获取...
Lock接口提供了更细粒度的锁控制,可以实现公平锁、非公平锁、可重入锁等。Atomic类提供了原子操作,适用于简单的共享变量更新场景。 Java内存模型(JMM)是理解并发编程中内存可见性问题的基础。它定义了线程如何...
- **Lock**:提供了更细粒度的锁控制,如ReentrantLock,可实现公平锁、非公平锁,以及读写锁等。 4. **并发工具类**: - **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、...
这个压缩包“Java并发编程代码(包含运行依赖库)”显然是为了帮助开发者快速上手并实践Java并发编程,无需花费时间寻找和配置相关的依赖库。 首先,让我们深入理解Java并发编程的核心概念。在Java中,并发是通过...
Java提供了公平锁和非公平锁策略来避免这些问题。 最后,Java的并发模型还包括Future和Callable接口,它们可以用于异步计算,并获取计算结果。FutureTask是Future的一个具体实现,它结合了Runnable和Future,可以...
Java 并发之 ReentrantLock ReentrantLock 是 Java 并发包中的一个技术,在...ReentrantLock 是 Java 并发包中的一个重要组件,它支持重入性,提供了公平锁和非公平锁两种锁机制,满足了开发者在并发编程中的需求。
此外,Java还提供了显式的锁机制,如 ReentrantLock,它提供了比synchronized更灵活的锁管理方式,包括公平锁和非公平锁、可重入锁、读写锁等特性。书中会有实际的案例演示如何使用这些锁来解决并发问题。 线程池是...
// 简化版实现,省略了公平锁和非公平锁的逻辑 while (!tryLock()) { waiters.add(Thread.currentThread()); LockSupport.park(); } } @Override public boolean tryLock() { if (state.get() == 0 && ...
Java中的`ReentrantLock`类是Lock接口的一个实现,它支持公平锁和非公平锁,以及可中断和定时等待等高级特性。使用Lock锁需要手动获取和释放,这样可以灵活地控制同步块的范围,提高程序的执行效率。然而,如果不...
公平锁和非公平锁的区别在于线程获取锁的顺序。读写锁(如ReentrantReadWriteLock)允许多个读操作并行执行,但写操作是独占的。 9. 并发问题和解决方案 并发编程中常见问题包括死锁(DeadLock)、活锁(LiveLock)...
内置锁通过`synchronized`实现,而显式锁如`Lock`接口及其实现(如`ReentrantLock`)提供了更高级的功能,如可中断、公平性和尝试获取锁。 4. **并发容器**:Java并发库提供了一系列优化过的并发容器,如`...
典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...
1. **公平锁与非公平锁**:`ReentrantLock`提供了两种获取锁的策略,公平锁和非公平锁。公平锁保证等待最久的线程优先获得锁,而非公平锁则不保证线程获取锁的顺序,可能会导致饥饿现象。`ReentrantLockFairDemo....
6. **锁优化**:Java提供了许多锁优化策略,如偏向锁、轻量级锁和自旋锁。偏向锁适用于无竞争的场景,轻量级锁用于轻度竞争,而自旋锁则让线程在等待锁释放时保持活跃,避免不必要的上下文切换。 7. **并发调试**:...