• Java开发之高并发必备篇(六)——Lock和ReentrantLock(2)


    ReentrantLock锁的使用

    · ReentrantLock锁的可重入性

    之前我们介绍了ReentrantLock是一个可重入的锁,意思就一个线程可以多次的获取到锁,下面我们来看下它的可重入性。

    在这里插入图片描述

    运行上述代码,结果如下:

    在这里插入图片描述

    上述代码中线程1先通过lock.lock()表示获取到锁,然后通过调用线程的sleep()方法休眠0.5s之后,再次循环发现线程1又获取到了锁,总共获取了3次锁所以这就证明了ReentrantLock 锁可以被一个线程多次持有,又因为没有释放锁,所以线程2无法获取到锁程序也没有停止。

    · ReentrantLock公平锁和非公平锁

    在创建ReentrantLock对象的时候,我们可以通过在构造方法中传入一个boolean值来切换公平锁和非公平锁。

    (1)默认非公平锁实现

    在这里插入图片描述

    在这里插入图片描述

    运行结果如下:

    在这里插入图片描述

    上述代码中我们开启了10个线程让每个线程都获取3次锁,通过运行结果我们发现,有的线程连续多次获取到了锁,而有的线程只能连续一次获取到锁,这些线程都是在竞争资源并且资源不是公平分配的,这就是非公平锁。

    (2)公平锁实现

    当我们在创建ReentrantLock对象的时候传入一个true的时候,就变成了公平锁,实现如下:

    在这里插入图片描述

    运行结果:

    在这里插入图片描述

    通过运行结果我们发现不管多少次的运行,每个线程都是只连续一次获取到锁,资源都是在平均分配的所以是公平锁。

    · 限时等待

    我们可以通过tryLock()方法传入一个时间来完成限时等待,即如果一个线程在指定时间内无法获取锁则会返回一个false表示获取锁失败,如果获取成功返回true,这样我们可以通过返回的结果来做出对应的处理。

    在这里插入图片描述

    在这里插入图片描述

    运行结果:

    在这里插入图片描述

    我们发现不管多少次运行都只打印一个线程,这是因为当第一个线程尝试获取锁的时候是可以获取的,但是之后睡眠3s,第二个线程尝试获取锁的时候就获取不到处于等待但是只等待1秒,就获取锁失败不再获取了锁。

    未完待续…

  • 相关阅读:
    axios---封装loadding组件的显示和隐藏
    Typora消失的图片?
    Java代码中如何向一个HashMap中添加元素呢?
    Linux文件系统之inode
    机器人迷雾之算力与智能
    docker-compose部署Atomci(云原生CICD平台)
    Qt实现桌面画线、标记,流畅绘制,支持鼠标和多点触控绘制
    java 使用策略模式减少if
    基于单片机的语音存储与回放系统设计
    TensorRT学习笔记(一)——使用Python API调用TensorRT
  • 原文地址:https://blog.csdn.net/weixin_43802541/article/details/127412135