zoukankan      html  css  js  c++  java
  • Java并发之FairSync和NonfairSync

    Java并发中的fairSync和NonfairSync主要区别为:

    如果当前线程不是锁的占有者,则NonfairSync并不判断是否有等待队列,直接使用compareAndSwap去进行锁的占用;

    如果当前线程不是锁的占有者,则FairSync则会判断当前是否有等待队列,如果有则将自己加到等待队列尾;

    对应的源码如下:

    FairSync (注意FairSync和NonFairSync均继承自AbstractQueuedSynchronizer):

    protected final boolean tryAcquire(int acquires) {
        final Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
    //判断是否有等待队列,没有队列时,进行占用,如果占用失败,将自己加到等待队列尾
    if(!hasQueuedPredecessors() &&
                compareAndSetState(0, acquires)) {
    return true;  
            } 
                setExclusiveOwnerThread(current);
                compareAndSetState(0, acquires)) {
                setExclusiveOwnerThread(current);
                return true;
            }
                compareAndSetState(0, acquires)) {
                setExclusiveOwnerThread(current);
                return true;
            }
                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;
    }
    

      

    NonFairSync:

    final boolean nonfairTryAcquire(int acquires) {
        final Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
            //不判断是否有等待队列,直接进行占用,如果占用失败也进到等待队列尾
            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;
    }
    

      

    占用失败后,将自己加到等待队列尾的动作在AbstractQueuedSynchronizerder类acquire方法中:
    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
    

      



    由于FairSync和NonFairSync均继承AbstractQueuedSynchronizerder(AQS),
    这里使用了到了一个设计模式(模板模式)来设计NonFairSync和FairSync类

  • 相关阅读:
    ch4-SPSS Statistics操作进阶
    ch3-SPSS Statistics操作入门
    概率论与数理统计-ch7-参数估计
    概率论与数理统计-ch6-样本与抽样分布
    概率论与数理统计-ch5-大数定律及中心极限定理
    概率论与数理统计-ch4-随机变量的数字特征
    概率论与数理统计-ch3-多维随机变量及其分布
    Maven的依赖冲突
    eclipse下的server插件
    JQuery了解
  • 原文地址:https://www.cnblogs.com/kisf/p/8432976.html
Copyright © 2011-2022 走看看