`

java并发库 Lock 公平锁和非公平锁

 
阅读更多

          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的规则从队列中取到自己

非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式

 

//公平获取锁   java.util.concurrent.locks.ReentrantLock$FairSync.java

protected final boolean tryAcquire( int acquires) {
     final Thread current = Thread.currentThread();
     int c = getState();
     //状态为0,说明当前没有线程占有锁
     if (c == 0 ) {
         //如果当前线程是等待队列的第一个或者等待队列为空,则通过cas指令设置state为1,当前线程获得锁
         if (isFirst(current) &&
             compareAndSetState( 0 , acquires)) {
             setExclusiveOwnerThread(current);
             return true ;
         }
     }
//如果当前线程本身就持有锁,那么叠加状态值,持续获得锁
     else if (current == getExclusiveOwnerThread()) {
         int nextc = c + acquires;
         if (nextc < 0 )
             throw new Error( "Maximum lock count exceeded" );
         setState(nextc);
         return true ;
      }
      //以上条件都不满足,那么线程进入等待队列。
      return false ;

}

        //非公平获取锁   java.util.concurrent.locks.ReentrantLock$UnFairSync.java

 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;
        }

 

 

 

分享到:
评论

相关推荐

    公平锁&非公平锁.pdf

    "公平锁&非公平锁" 公平锁(Fair Lock)和非...公平锁和非公平锁都是 ReentrantLock 的实现方式,前者能够避免饥饿现象的发生,而后者可能会导致饥饿现象的发生。开发者可以根据实际情况选择使用公平锁或非公平锁。

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    在Java中,ReentrantLock(可重入锁)是Lock接口的主要实现,它支持公平锁和非公平锁策略。公平锁保证按照线程请求锁的顺序进行分配,而非公平锁则不保证这一点,但通常效率更高。 条件变量(Condition)是Lock的一...

    java 线程公平锁与非公平锁详解及实例代码

    Java线程公平锁与非公平锁是并发编程中重要的概念,尤其在使用ReentrantLock时。ReentrantLock是Java并发包(java.util.concurrent)中的一个可重入互斥锁,它提供了比内置的synchronized关键字更为灵活的锁操作。 ...

    C#实操控制并发之Lock和Redis分布式锁

    本文将深入探讨C#中如何使用Lock和Redis分布式锁来解决并发问题,以秒杀系统为例进行阐述。 首先,让我们理解什么是并发控制。并发控制是指在多线程环境下确保数据的一致性和完整性,防止多个线程同时访问同一资源...

    java并发库高级应用源码--张孝祥

    Java中的`ReentrantLock`就是一种阻塞锁,它支持公平锁和非公平锁模式。 阻塞队列是线程间的另一种通信方式,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们在`java.util.concurrent`包下。阻塞队列在生产...

    java并发编程2

    - **Lock接口与ReentrantLock** 提供了比`synchronized`更细粒度的锁控制,可以实现公平锁和非公平锁,以及可中断和可重入的特性。 4. **并发设计模式** - **生产者-消费者模式** 使用队列作为缓冲区,一个线程...

    第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()1

    本篇文章将深入解析ReentrantLock的源码,重点讨论非公平锁和公平锁的获取过程。 1. **ReentrantLock的基本概念** ReentrantLock是由Java提供的可重入互斥锁,支持公平锁和非公平锁两种模式。非公平锁的特性是获取...

    java并发编程内部分享PPT

    Lock接口提供了更细粒度的锁控制,可以实现公平锁、非公平锁、可重入锁等。Atomic类提供了原子操作,适用于简单的共享变量更新场景。 Java内存模型(JMM)是理解并发编程中内存可见性问题的基础。它定义了线程如何...

    JAVA并发编程艺术pdf版

    - **Lock**:提供了更细粒度的锁控制,如ReentrantLock,可实现公平锁、非公平锁,以及读写锁等。 4. **并发工具类**: - **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、...

    Java并发编程代码(包含运行依赖库)

    这个压缩包“Java并发编程代码(包含运行依赖库)”显然是为了帮助开发者快速上手并实践Java并发编程,无需花费时间寻找和配置相关的依赖库。 首先,让我们深入理解Java并发编程的核心概念。在Java中,并发是通过...

    Java并发编程常识-梁飞.rar

    Java提供了公平锁和非公平锁策略来避免这些问题。 最后,Java的并发模型还包括Future和Callable接口,它们可以用于异步计算,并获取计算结果。FutureTask是Future的一个具体实现,它结合了Runnable和Future,可以...

    java并发之ReetranLock

    Java 并发之 ReentrantLock ReentrantLock 是 Java 并发包中的一个技术,在...ReentrantLock 是 Java 并发包中的一个重要组件,它支持重入性,提供了公平锁和非公平锁两种锁机制,满足了开发者在并发编程中的需求。

    java并发实战pdf及demo源码

    此外,Java还提供了显式的锁机制,如 ReentrantLock,它提供了比synchronized更灵活的锁管理方式,包括公平锁和非公平锁、可重入锁、读写锁等特性。书中会有实际的案例演示如何使用这些锁来解决并发问题。 线程池是...

    java的Lock锁原理详解.docx

    // 简化版实现,省略了公平锁和非公平锁的逻辑 while (!tryLock()) { waiters.add(Thread.currentThread()); LockSupport.park(); } } @Override public boolean tryLock() { if (state.get() == 0 && ...

    线程并发时 本地变量和Lock锁的效率比较

    Java中的`ReentrantLock`类是Lock接口的一个实现,它支持公平锁和非公平锁,以及可中断和定时等待等高级特性。使用Lock锁需要手动获取和释放,这样可以灵活地控制同步块的范围,提高程序的执行效率。然而,如果不...

    Java并发编程全景图.pdf

    公平锁和非公平锁的区别在于线程获取锁的顺序。读写锁(如ReentrantReadWriteLock)允许多个读操作并行执行,但写操作是独占的。 9. 并发问题和解决方案 并发编程中常见问题包括死锁(DeadLock)、活锁(LiveLock)...

    java并发编程实战高清版pdf

    内置锁通过`synchronized`实现,而显式锁如`Lock`接口及其实现(如`ReentrantLock`)提供了更高级的功能,如可中断、公平性和尝试获取锁。 4. **并发容器**:Java并发库提供了一系列优化过的并发容器,如`...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...

    Java多线程高并发篇(一)--重入锁

    1. **公平锁与非公平锁**:`ReentrantLock`提供了两种获取锁的策略,公平锁和非公平锁。公平锁保证等待最久的线程优先获得锁,而非公平锁则不保证线程获取锁的顺序,可能会导致饥饿现象。`ReentrantLockFairDemo....

    java并发编程技术

    6. **锁优化**:Java提供了许多锁优化策略,如偏向锁、轻量级锁和自旋锁。偏向锁适用于无竞争的场景,轻量级锁用于轻度竞争,而自旋锁则让线程在等待锁释放时保持活跃,避免不必要的上下文切换。 7. **并发调试**:...

Global site tag (gtag.js) - Google Analytics