码农小汪-ReentrantLock 可重入锁

2024-08-21 00:58

本文主要是介绍码农小汪-ReentrantLock 可重入锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。

对于ReentrantLock,官方有详细的说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

ReentrantLock提供公平锁机制,构造方法接收一个可选的公平参数。当设置为true时,它是公平锁,这些所将访问权授予等待时间最长的线程。否则该锁将无法保证线程获取锁的访问顺序。但是公平锁与非公平锁相比,公平锁的程序在许多线程访问时表现为很低的总体吞吐量。

   /*** Creates an instance of {@code ReentrantLock}.* This is equivalent to using {@code ReentrantLock(false)}.*/public ReentrantLock() {sync = new NonfairSync();}/*** Creates an instance of {@code ReentrantLock} with the* given fairness policy.** @param fair {@code true} if this lock should use a fair ordering policy*/public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}

这里写图片描述
这里面写的几多复杂的!
我们来个简单的实例就行,我把刚刚自己实现的lock换成了他来使用

package ThredDemo;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** * @author JetWang**/
public class ThreadLock {private int count = 0;Lock l = new ReentrantLock();public void test() {// TODO Auto-generated method stubtry {l.lock();for (int i = 0; i < 5; i++) {count++;System.out.println(Thread.currentThread().getName() + "count:"+ count);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {l.unlock();}}public static void main(String[] args) {ThreadLock testLock = new ThreadLock();for (int i = 0; i < 3; i++) {new Thread(new Runnable() {@Overridepublic void run() {testLock.test();}}).start();}}
}
Thread-0count:1
Thread-0count:2
Thread-0count:3
Thread-0count:4
Thread-0count:5
Thread-1count:6
Thread-1count:7
Thread-1count:8
Thread-1count:9
Thread-1count:10
Thread-2count:11
Thread-2count:12
Thread-2count:13
Thread-2count:14
Thread-2count:15

ReentrantLock与synchronized的区别

我么有看懂,慢慢的学习吧~
前面提到ReentrantLock提供了比synchronized更加灵活和强大的锁机制,那么它的灵活和强大之处在哪里呢?他们之间又有什么相异之处呢?

首先他们肯定具有相同的功能和内存语义。

1、与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。

2、ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。

3、ReentrantLock提供了可轮询的锁请求。它会尝试着去获取锁,如果成功则继续,否则可以等到下次运行时处理,而synchronized则一旦进入锁请求要么成功要么阻塞,所以相比synchronized而言,ReentrantLock会不容易产生死锁些。

4、ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。

5、ReentrantLock支持中断处理,且性能较synchronized会好些。

这篇关于码农小汪-ReentrantLock 可重入锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091670

相关文章

可重入锁和不可重入锁概念和区别

可重入锁就是一个类的A、B两个方法,A、B都有获得统一把锁,当A方法调用时,获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也获得该锁。 这种情景,可以是不同的线程分别调用这个两个方法。也可是同一个线程,A方法中调用B方法,这个线程调用A方法。 不可重入锁就是一个类的A、B两个方法,A、B都有获得统一把锁,当A方法调用时,获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也获得不

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

synchronized wait()/notify 对比 ReentrantLock await()/signal()

结论 synchronized synchronized 配合 wait()/notify 无法实现精准唤醒线程 ReentrantLock ReentrantLock 配合 Condition await()/signal() 可以实现精准唤醒线程 (指唤醒指定的线程) ReentrantLock 如何实现精准唤醒线程 一个 lock 配合多个 Condition, 且

ReentrantLock的lockInterruptibly()理解

ReentrantLock锁有几种:lock、tryLock、tryLock(long timeout, TimeUnit unit)、lockInterruptibly。 lock 阻塞等待获取锁,优先考虑获取锁,待获取锁成功后,才响应中断。 lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。  tryLock() 是一个有返回值的方法,试图申请一个锁

【并发】Lock与ReentrantLock

1 Lock基本使用 Lock能实现代码同步,它比synchronized更具灵活性,什么时候锁住,什么时候释放锁等都是看得见的,使用时必须使用try{}finally{},意思是万一发生异常或者错误都可以释放锁。 try{}finally{//释放锁} 使用示例 public class SaleTicket implements Runnable {private int tic

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时,将使用可重入VI。当VI不可重入时,VI只有一个数据空间。因此,一次只能有一个调用者运行VI,因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项,但您可以将VI设置为可重入。其中有两种类型的重入:共享 和 预分配。 共享的可重入VI 如果选择了共享克隆可重入执行选项,则VI会具有一个数据空间池(与克隆池相同)。最初在调用VI开始时

多线程篇(基本认识 - 公平锁 非公平锁、独占锁 共享锁、可重入锁、自旋锁)(持续更新迭代)

目录 锁一:公平锁与非公平锁 前言 一、Lock 锁接口 二、公平锁 1. 简介 三、非公平锁 1. 简介 四、JUC 1. ReentranLock 公平锁 非公平锁 锁二:独占锁 & 共享锁 前言 一、简介 二、代码示例 1. 未加锁状态 2. 加锁状态 锁三:可重入锁 前言 一、简介 二、代码示例 锁四:自旋锁 一、前言 二、问题思考 三、思

ReentrantLock可重入锁又是怎么回事?

前言:有关Synchronized锁的知识可以参考我上篇写的内容synchronized必知必会的知识点 一:ReentrantLock的实现原理 锁的实现原理基本是为了达到一个目的:让所有的线程都能看到某种标记。Synchronized通过在对象头中设置标记实现了这一目的,是一种/原生的锁实现方式,而ReentrantLock以及所有的基于LocK接口的实现类,都是通过用一个volitl

Java并发之ReentrantLock详解

原文: http://blog.csdn.net/lipeng_bigdata/article/details/52154637      一、入题         ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: [java] view plain copy ReentrantLoc

除了Synchronized和ReentrantLock外,有哪些别的同步机制

除了synchronized和ReentrantLock外,有哪些别的同步机制 答案: Java提供了多种同步机制和锁用来满足不同的并发需求。除synchronized和ReentrantLock之外,还有以下几种: 1. CountDownLatch(倒计时器):允许一个或多个线程等待其他线程完成操作。它维护了一个计数器,表示需要等待的事件数量。每当一个事件完成时,计数器减一。 当计数器