Jdk17ReentrantLock源码分析及优化建议

背景

jdk17也发布很久了,jdk对ReentrantLock做了很多优化,代码简洁了很多,
我这两天简单看了以下,ReentrantLock,发现有可以优化的地方。

类继承结构

image.png
整体继承结构没变,还是两个类,NonfairSync 和 FairSync,一个公平锁,一个非公平锁。
再看看方法,方法有改变
image.png

NonfairSync的方法

final boolean initialTryLock() {
    Thread current = Thread.currentThread();
    if (compareAndSetState(0, 1)) { // first attempt is unguarded
        setExclusiveOwnerThread(current);
        return true;
    } else if (getExclusiveOwnerThread() == current) {
        int c = getState() + 1;
        if (c < 0) // overflow
            throw new Error("Maximum lock count exceeded");
        setState(c);
        return true;
    } else
        return false;
}

tryAcquire

protected final boolean tryAcquire(int acquires) {
            if (getState() == 0 && compareAndSetState(0, acquires)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }

FairSync的类差不多,只是多了判断是否公平判断,可以看到NonfairSync和FairSync 代码类似,
既然使用了模板方法模式,为什么不再优化一下代码,提取方法呢?

将initialTryLock 的 !hasQueuedThreads() 和 !hasQueuedPredecessors()提取到sync里面去,
NonfairSync里面的方法都返回true,FairSync里面再具体判断。

优化建议代码如下

abstract static class Sync extends AbstractQueuedSynchronizer {
    
    protected boolean skipFair() {
        throw new UnsupportedOperationException();
    }
    
    protected boolean skipCheckQueuedPredecessors() {
        throw new UnsupportedOperationException();
    }
    
    boolean initialTryLock() {
        Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
            //add skipFair
            if (skipFair() && compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(current);
                return true;
            }
        } else if (getExclusiveOwnerThread() == current) {
            if (++c < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(c);
            return true;
        }
        return false;
    }
    
    protected final boolean tryAcquire(int acquires) {
        //add skipCheckQueuedPredecessors
        if (getState() == 0 && skipCheckQueuedPredecessors() &&
                compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }
}
static final class NonfairSync extends Sync {
    private static final long serialVersionUID = 7316153563782823691L;

    @Override
    protected boolean skipFair() {
        return true;
    }

    @Override
    protected boolean skipCheckQueuedPredecessors() {
        return true;
    }

}
static final class FairSync extends Sync {
    private static final long serialVersionUID = -3000897897090466540L;

    @Override
    protected boolean skipFair() {
        return !hasQueuedThreads();
    }

    @Override
    protected boolean skipCheckQueuedPredecessors() {
        return !hasQueuedPredecessors();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要访问Oracle官方网站以获取JDK 17的安装文件。 步骤 1: 下载JDK 17安装文件 在Oracle官方网站的Java SE下载页面中,找到适合你操作系统的JDK 17版本。点击相应的下载链接,然后接受许可协议并选择适合你操作系统的安装文件。 步骤 2: 运行安装程序 一旦下载完成,双击安装文件运行安装程序。根据你的操作系统,可能会有一些特定的步骤。按照安装程序的指示进行操作。 步骤 3: 配置环境变量 一旦安装完成,你需要配置系统的环境变量,以便在命令行中能够使用JavaJavac命令。 - Windows: 在开始菜单中搜索"环境变量",然后选择"编辑系统环境变量"。在弹出的窗口中,点击"环境变量"按钮。 在"系统变量"部分,找到名为"Path"的变量,并双击编辑它。在变量值的末尾添加JDK 17的安装路径,例如:`C:\Program Files\Java\jdk-17\bin`。 点击确定保存更改。 - macOS: 打开终端,并输入以下命令来编辑bash配置文件:`nano ~/.bash_profile`。 在打开的文件中,添加以下行:`export PATH="/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin:$PATH"`。 按Ctrl + X保存并退出nano编辑器。 - Linux: 打开终端,并输入以下命令来编辑bash配置文件:`nano ~/.bashrc`。 在打开的文件中,添加以下行:`export PATH="/usr/lib/jvm/jdk-17/bin:$PATH"`。 按Ctrl + X保存并退出nano编辑器。 步骤 4: 验证安装 打开一个新的命令行窗口,并运行以下命令来验证JDK 17的安装: ``` java -version ``` 如果你看到Java版本信息,说明安装成功。 这就是JDK 17的安装和配置教程。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值