Java开发之高并发必备篇——Lock和ReentrantLock

Posted weixin_43802541

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java开发之高并发必备篇——Lock和ReentrantLock相关的知识,希望对你有一定的参考价值。

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秒,就获取锁失败不再获取了锁。

未完待续…

以上是关于Java开发之高并发必备篇——Lock和ReentrantLock的主要内容,如果未能解决你的问题,请参考以下文章

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇:Lock和ReentrantLock

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇——线程的状态调度和操作方法

Java开发之高并发必备篇——线程的状态调度和操作方法