ReentrantLock可重入锁

2024-06-19 05:12
文章标签 reentrantlock 重入

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

可重⼊锁,这个锁可以被线程多次重复进⼊进⾏获取操作。
ReentantLock继承接⼝Lock并实现了接⼝中定义的⽅法,除了能完成synchronized所能完成的所有⼯作 外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线程死锁的⽅法。
在并发量较⼩的多线程应⽤程序中,ReentrantLock与synchronized性能相差⽆⼏,但在⾼ 并发量的条件下,synchronized性能会迅速下降⼏⼗倍,⽽ReentrantLock的性能却能依然维持⼀个⽔ 准。
因此我们建议在⾼并发量情况下使⽤ReentrantLock。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Counter {private final Lock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();  // 获取锁try {count++;} finally {lock.unlock();  // 释放锁}}public int getCount() {return count;}public static void main(String[] args) {Counter counter = new Counter();// 创建两个线程,模拟并发访问共享资源Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});t1.start();t2.start();// 等待两个线程执行完毕try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final count is: " + counter.getCount());}
}
public class Counter {private int count = 0;// 使用 synchronized 关键字修饰方法,确保线程安全public synchronized void increment() {count++;}public int getCount() {return count;}public static void main(String[] args) {Counter counter = new Counter();Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter.increment();}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final count is: " + counter.getCount());}
}

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



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

相关文章

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

可重入锁就是一个类的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(倒计时器):允许一个或多个线程等待其他线程完成操作。它维护了一个计数器,表示需要等待的事件数量。每当一个事件完成时,计数器减一。 当计数器