Java中的ReentrantLock使用解析

 更新时间:2023年11月01日 11:48:30   作者:兴趣使然的程序猿  
这篇文章主要介绍了Java中的ReentrantLock使用解析,ReentrandLock即可重入锁,可重入锁解决的是重入锁定的问题,重入锁定指的是当一个线程执行逻辑时,需要两次获取锁,而该锁不可重入就会导致内部嵌套无法获取锁导致Reentrance Lockout发生,需要的朋友可以参考下

ReentrandLock

故名思意,ReentrandLock即可重入锁。

可重入锁解决的是重入锁定的问题,重入锁定(Reentrance Lockout)指的是当一个线程执行逻辑时,需要两次获取锁,而该锁不可重入就会导致内部嵌套无法获取锁导致Reentrance Lockout发生。

Reentrance Lockout解决办法为一个线程两次获取锁的中间一定需要释放锁。

1 ReentrandLock继承关系

此处知道ReentrandLock是Lock接口的实现即可。

ReentrantLock继承关系

2 ReentradLock使用

声明锁即new创建锁。

static Lock lock = new ReentrantLock();
//修改时需要锁定的资源
static String text = "hello";

不加锁对text进行修改。

public static void modifyWithoutLock(){
    text += " "+Thread.currentThread().getName();
}
public static void main(String[] args) throws InterruptedException {
    modifyWithoutLock();
    for (int i=0;i<100;i++) {
        new Thread(() -> {
            modifyWithoutLock();
        }).start();
    }
    Thread.sleep(50);
    System.err.println(text.length());
}

不加锁修改后text的长度为:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可知,对一个String变量多线程不加锁的情况下最后结果的长度很大概率是不一样的。 加锁对text进行修改。

public static void modify(){
	//使用lock方法枷锁
    lock.lock();
    try {
        text += " "+Thread.currentThread().getName();
    }catch (Exception e){
        e.printStackTrace();
    }
    finally {
    	//使用unlock方法解锁
        lock.unlock();
    }
}

在这里插入图片描述

加锁之后对多线程对text的修改最后的长度是一定的(这儿不能保证线程修改的顺序)。

2 ReentradLock方法介绍

ReentrandLock作用
tryLock()尝试获取锁
tryLock(long timeout, TimeUnit unit)尝试获取锁,timeout是尝试获取锁的等待事件,超时不候,unit是等待时间的单位
unlock()释放锁
getHoldCount()当前线程持有该锁的次数
isHeldByCurrentThread()当前线程是否持有该锁

3 ReentrandLock源码

构造方法

public ReentrantLock() {
    sync = new NonfairSync();
}

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 * 如果fair为true则构造是一个公平锁
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

ReentrandLock默认是非公平锁,也可以通过传入一个boolean fair的参数构造来声明该锁是公平锁还是非公平锁。

内部组成

在这里插入图片描述

private final Sync sync;

其内部由一个Sync sync属性组成,其是ReentradLock的内部类,Sync抽象内有NonfairSync和FairSync两种子类实现,分别表示非公平锁和公平锁。

加解锁方法

public void lock() {
    sync.lock();
}
public void unlock() {
    sync.release(1);
}

其具体实现其实是Sync的子类FairSync或者NonfairSync的方法,具体使用的哪个看构造的时候是公平锁还是非公平锁,对于Sync的解析放在后边再说。

到此这篇关于Java中的ReentrantLock使用解析的文章就介绍到这了,更多相关Java中的ReentrantLock内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在SpringBoot中使用jwt实现token身份认证的实例代码

    在SpringBoot中使用jwt实现token身份认证的实例代码

    你还不会在SpringBoot中使用jwt实现token身份认证吗,本文小编就给大家详细的介绍一下在SpringBoot中使用jwt实现token身份认证的实例代码,感兴趣的同学可以自己动手试一试
    2023-09-09
  • 深入剖析Java工厂模式让你的代码更灵活

    深入剖析Java工厂模式让你的代码更灵活

    Java工厂模式是一种创建对象的设计模式,它可以在不暴露对象创建逻辑的情况下,将对象的创建委托给子类或者其他对象。本文就来深入剖析一下Java工厂模式是如何让你的代码更灵活、可扩展、易维护的
    2023-05-05
  • 浅谈Java中Lambda表达式的相关操作

    浅谈Java中Lambda表达式的相关操作

    java8新特性,Lambda是一个匿名函数,类似Python中的Lambda表达式、js中的箭头函数,目的简化操作,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 详解关于spring bean名称命名的那些事

    详解关于spring bean名称命名的那些事

    每个bean都有一个或者多个标识符,这些标识符在容器中必须是唯一的,这篇文章主要给大家介绍了关于spring bean名称命名的那些事,需要的朋友可以参考下
    2021-07-07
  • spring-boot react如何一步一步实现增删改查

    spring-boot react如何一步一步实现增删改查

    这篇文章主要介绍了spring-boot react如何一步一步实现增删改查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 使用springboot实现上传文件时校验文件是否有病毒

    使用springboot实现上传文件时校验文件是否有病毒

    在SpringBoot中实现文件上传时的病毒校验,可以使用ClamAV、Metascan或VirusTotal等工具,这些工具通过扫描上传的文件,可以有效地检测和阻止恶意软件的传播,安装和配置ClamAV服务的步骤如下:下载并安装ClamAV二进制文件,配置clamd.conf文件
    2025-01-01
  • Spring Boot中优雅地处理参数传递的技巧分享

    Spring Boot中优雅地处理参数传递的技巧分享

    最近一直在学习Spring Boot,今天将其中的从前台过来的参数传递总结一下,下面这篇文章主要给大家介绍了关于Spring Boot中优雅地处理参数传递的技巧,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Spring的@ComponentScan注解用法介绍

    Spring的@ComponentScan注解用法介绍

    这篇文章主要介绍了Spring的@ComponentScan注解用法介绍,@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理,需要的朋友可以参考下
    2023-11-11
  • 关于BufferedReader的读取效率问题

    关于BufferedReader的读取效率问题

    这篇文章主要介绍了关于BufferedReader的读取效率问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Data Jpa 自动生成表结构的方法示例

    Spring Data Jpa 自动生成表结构的方法示例

    这篇文章主要介绍了Spring Data Jpa 自动生成表结构的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论