Java Concurrent Lock ReentrantLock简介

基于ESP32与JavaScript的Stack-chan桌面机器人:从硬件组装到AI交互的完整实践 嵌入式系统开发是连接物理世界与数字世界的核心技术,其核心原理在于通过微控制器直接操作硬件外设,实现感知、决策与执行。这项技术的核心价值在于为物联网、智能硬件和机器人等领域提供了低功耗、高可靠性的解决方案。在机器人应用场景中,嵌入式平台常作为主控大脑,驱动舵机、传感器并处理交互逻辑。本文聚焦的Stack-chan项目,正是这一理念的生动实践:它采用流行的ESP32微控制器,并创新性地通过Moddable运行时支持使用JavaScript进行嵌入式开发,极大地降低了机器人编程的门槛。开发者可以基于此平台,轻松实 阅读详情

Java concurrent包下面的lock功能介绍,摘自java核心编程第八绻 多线程 章节

直接上代码:

Listing 14–8 Bank.java
1. import java.util.concurrent.locks.*;
2.
3. /**
4. * A bank with a number of bank accounts that uses locks for serializing access.
5. * @version 1.30 2004-08-01
6. * @author Cay Horstmann
7. */
8. public class Bank
9. {
10. /**
11. * Constructs the bank.
12. * @param n the number of accounts
13. * @param initialBalance the initial balance for each account
14. */
15. public Bank(int n, double initialBalance)
16. {
17. accounts = new double[n];
18. for (int i = 0; i < accounts.length; i++)
19. accounts[i] = initialBalance;
20. bankLock = new ReentrantLock();
21. sufficientFunds = bankLock.newCondition();
22. }
23.
24. /**
25. * Transfers money from one account to another.
26. * @param from the account to transfer from
27. * @param to the account to transfer to
28. * @param amount the amount to transfer
29. */
30  public void transfer(int from, int to, double amount) throws InterruptedException
31. {
32. bankLock.lock();
33. try
34. {
35. while (accounts[from] < amount)
36. sufficientFunds.await();
37. System.out.print(Thread.currentThread());
38. accounts[from] -= amount;
39. System.out.printf(" %10.2f from %d to %d", amount, from, to);
40. accounts[to] += amount;
41. System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
42. sufficientFunds.signalAll();
43. }
44. finally
45. {
46. bankLock.unlock();
47. }
48. }
49.
50. /**
51. * Gets the sum of all account balances.
52. * @return the total balance
53. */
54. public double getTotalBalance()
55. {
56. bankLock.lock();
57. try
58. {
59. double sum = 0;
60.
61. for (double a : accounts)
62. sum += a;
63.
64. return sum;
65. }
66. finally
67. {
68. bankLock.unlock();
69. }
70. }
71.
72. /**
73. * Gets the number of accounts in the bank.
74. * @return the number of accounts
75. */
76. public int size()
77. {
78. return accounts.length;
79. }
80.
81. private final double[] accounts;
82. private Lock bankLock;
83. private Condition sufficientFunds;
84. }

(1)ReentrantLock 可重入锁,使用lock()和unlock()来获取和释放锁

(2)newCondition() 创建可以使用wait(),notify()等同方法的对象,该对象可以使用的方法

void await()
puts this thread on the wait set for this condition.
• void signalAll()
unblocks all threads in the wait set for this condition.
• void signal()
unblocks one randomly selected thread in the wait set for this condition.

使用signalAll()方法,激活调用await()方法阻塞的线程,线程恢复以后,将从调用await方法的地方,继续往下执行。

(3)如果可以使用synchronized,wait,notify等方法,满足我们条件的话,尽量使用这些,因为这样代码量少,而且不容易出错。



Read、Write Lock

1. Construct a ReentrantReadWriteLock object:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
2. Extract read and write locks:
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();

• Lock readLock()
gets a read lock that can be acquired by multiple readers, excluding all writers.
• Lock writeLock()
gets a write lock that excludes all other readers and writers.

【第三只眼:Oracle通过归档日志查看系统的业务高峰sql】 根据oracle归档的业务高峰量,查找业务sql,进行优化 阅读详情

相关推荐

用STM32CubeMX和HAL库,5分钟搞定TB6612驱动直流电机(附完整代码)

本文详细介绍了如何使用STM32CubeMX和HAL库快速配置TB6612驱动直流电机,包括硬件连接、CubeMX工程配置、电机驱动逻辑实现及进阶优化技巧。通过图形化工具和代码示例,即使是新手也能在5分钟内完成电机调速系统的搭建,大幅提升开发效率。

weixin_26854829的博客 266

ConCurrent并发包 - Lock详解

synchronized的缺陷 我们知道,可以利用synchronized关键字来实现共享资源的互斥访问。Java 5在java.util.concurrent.locks包下提供了另一种来实现线程的同步访问,那就是Lock。既然有了synchronized来实现线程同步,Java为什么还需要提供Lock呢? synchronized是Java的一个关键字,当我们使用synchroni

Dave's Blog 3982

SPI扩展CAN方案:从寄存器配置到多路通信实战

本文详细介绍了SPI扩展CAN方案的实现方法,从寄存器配置到多路通信实战。通过使用MCP2517FD芯片和SPI接口,可低成本扩展多路CAN通道,适用于工业控制领域。文章涵盖硬件设计、寄存器配置、中断优化及性能调优等核心内容,帮助开发者高效解决设备节点过多的问题。

weixin_42657024的博客 362

Java多线程 Concurrent并发包——Lock

传统的线程协作   Thread 、Executor、 ForkJoin ——线程任务启动-》执行-》结束 ——线程间缺乏协作 Synchronized同步 ——同时限定一个线程进入关键区 性能损失较大 Lock ——java.lang.concurrent.lock包提供同步的效果 ——实现更为复杂的临界区结构 ——tryLock方法预判锁是否空闲 ——允许读写锁分离  符合 ...

一只老风铃 1207

基于反相器的超声波发生和气泡检测电路

本文主要介绍了关于超声波的两种电路——基于反相器的振荡电路和基于逻辑们的气泡检测电路

xehagy的博客 1955

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)

可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢? 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法A(方法A递归)。 不可重入锁(自旋锁):不可以再次进入方法A,也就是说获得锁进入方法A是此线程在释放锁钱唯一的一次进入方法A。 ,具体区别查看可重入锁和不可重入锁区别。 ...

weixin_30547797的博客 133

通过CN3口直接控制台达伺服电机A2-M(二)

既然可以通过RS485与伺服驱动器进行通讯,那么就肯定可以控制转速 首先,需要了解下 ‘控制模式及控制命令输入源设定’ 依据以上资料,速度控制模式有两种,S和SZ模式,分别对应模式选择中的02和04,对P1-01的地址0102进行写地址操作即可实现,一开始我使用了S模式,但是这个模式在寸动模式下会自动运转,不符合我控制的要求,后面改用SZ模式,就可以实现零速度。 使用串口工具发送命令:“01 06 01 02 00 04 28 35”即可以实现设置,设置完成后可以手动在伺服驱动器的按键面板上进行确

HKing_evil的博客 6825

Java Concurrent Lock锁

Lock比传统线程模型中的Synchronied方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码段要实现同步互斥的效果,它们必须用同一个Lock对象,锁是在代表要操作的资源的类的内部方法中,而不是线程代码中. class & interface   * Lock interface of lock, * ReentrantLock basic implem

jing_le的专栏 1255

优秀的 Verilog/FPGA开源项目介绍(二十六)- ISP (图像信号处理)

介绍查看《ISP算法及架构分析介绍》今天项目的顺序就是先介绍几个关于ISP算法架构的项目,包括python、matlab、c等高级语言实现的ISP算法架构,最后介绍一个FPGA实现ISP的项目。openISPhttps://github.com/cruxopen/openISP项目介绍用python实现的ISP架构,该架构涉及到的知识如下:下图是最新实现的模块:主要模块如...

OpenFPGA的博客 4946

从技术债红线到系统治理:透视 SAP Clean Core 中的 Level D

SAP推出的Clean Core分级体系将扩展风险划分为A到D四个等级,其中Level D代表最高风险类别,涉及直接修改标准代码、隐式增强、使用noAPI对象等不被推荐的做法。这些做法虽然短期见效快,但会带来升级冲突、数据完整性风险等长期问题。SAP强调治理重点不是完全消除经典ABAP,而是优先清理Level D对象,逐步向稳定接口迁移。典型案例显示,依赖内部细节的扩展往往在系统升级或云迁移时集中暴露出问题。企业应通过工具链持续监控Level D占比,将其纳入技术债管理范畴。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1063

java concurrent Lock

锁是一种工具,用于控制资源的并发访问 为什么synchronized不够用 1. 效率低: 锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程 2. 不够灵活 3. 不知道是否能够获得锁 一、接口Lock.java 1. void lock() 2. void unlock() 3. boolean tryLock() Lock lock = ...; if (lock.tryLock()) { try { // manipulate p.

平凡 333

【agent实战教程】OpenClaw多个agent一文通

一个合格的独立agent,必须具备6个完全独立的专属组件独立组件路径规则核心要求不独立的严重后果唯一agentId配置文件中全局唯一,不能重复,建议用英文+数字,不要有特殊字符agent配置冲突,消息派单错误,会话串线独立工作区(workspace)建议每个agent一个独立文件夹,不要共用人设、记忆、规则混在一起,agent人设崩塌,对话串线独立状态目录(agentDir)固定系统自动生成,绝对禁止多个agent复用同一个agentDir。

海兰 649

Java线程同步中的Lock锁,什么是ReentrantLock锁,ReentrantLock锁如何使用(一)

java、JUC

zhangfuping123456789的博客 7581

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java并发Concurrent包的锁(一)——Lock接口

Java 并发包 Concurrent 的包结构共可分为五个部分: - 原子类 - 锁 - collection并发集合框架 - excutor线程池 - 同步工具本文介绍 Lock 接口和其与 synchronized 关键字的对比。 Lock接口尽管 synchronized 在语法上已经足够简单了,在 JDK5 之前只能借助此实现,但是由于是独占锁,性能却不高,因此 JDK

在梅边的专栏 1472

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《深入浅出 Java Concurrency》—锁机制(一)Lock与ReentrantLock

<br /><br />转自:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html<br />前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。<br />上一个章节 中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合。<br />尽管synchronized在语法上已经足够

FG2006的专栏 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java.util.concurrent学习(九) Lock,ReentrantLock

Lock框架 Lock Lock是java.util.concurrent.locks包提供的一个锁操作接口,相比于synchronized只能定义实例域和Class域的代码块,该接口提供了更灵活的方法,在代码层面提供了锁的机制,笔者将会在另一篇文章说明sychronized和Lock的区别。我们来看看都定义了什么接口,下面提到的获取到锁的对象就是一个Lock实例,用同一个lock实例...

top_explore的博客 476

《Java源码分析》:ReentrantLock.lock 锁机制

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1154

java concurrent lock_java中的 java.util.concurrent.locks.ReentrantLock类的使用方式

实现了lock的类为:ReentrantLock接口的方式解释:lock()方法为获取锁对象,如果未获取到锁就一直获取锁。trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回false,如果获取到了则返回truetryLock(longtimeout,TimeUnitunit):表示在指定的时间内获取锁,如果未获取到,则返回false,否则返回trueunlock():为...

weixin_39636691的博客 456

Java中的synchronized锁和Lock锁的内存语义

详细介绍了Java中的synchronized锁和Lock锁的内存语义。

终生学习践行者 2839

JAVA多线程高并发之ReentrantLock讲解lock/unlock/tryLock方法

JAVA中多线程高并发场景下保证线程安全通常都会考虑加锁。但是在特殊场景下我们也可以采用java.util.concurrent包提供的线程安全的对象,避免加锁从而达到高效的目的。 但是,这些线程安全的对象仅仅指的是针对于原子性操作是线程安全的,如果多个方法同时调用无法保证线程安全,只能考虑加锁。这里我们举个列子:假设我们在多线程高并发场景下使用java.util.concurrent.Conc...

饶艳辉 3050

JUC下的Java java.util.concurrent.Locks详解

java.util.concurrent.locks 包是Java并发编程中非常重要的一个部分,它提供了比内置synchronized关键字更为灵活的锁机制,用于多线程环境下的同步控制。这个包中最核心的是Lock接口,以及一系列实现类,如ReentrantLock, ReentrantReadWriteLock, StampedLock, 和Condition接口等。

Rcain_R的博客 1400

java.util.concurrent(JUC)的研究--》锁机制--》Lock与ReentrantLock

从本文开始我们对JUC中比较重要的锁机制进行研究,下面我们来看下java.util.concurrent.locks.Lock接口和其实现类ReentrantLock。   互斥锁--Lock接口及其实现类ReentrantLock: 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问。而现在Loc

Davin_(幸福在于感悟).......... 1200

Java源码解读系列4—ReentrantLock(JDK1.8 )

1 概述 Java程序提供两种方法来实现锁功能1)synchronized关键字和2)lock接口,两者最大区别是synchronized是Java内置的关键字,是JVM层面的锁;而lock是java.util.concurrent包下面提供的工具,由Java代码编写的。在JDK1.6之前,synchronized是重量级锁,每次都会调用OS使线程进入阻塞状态;ReentrantLock是轻量锁,如果只是当单纯线程交替等场景,是不会触发OS的,性能优于synchronized关键字。现在两者性能已经差不多,

JayLaiSCUT的博客 4730

对比synchronized与java.util.concurrent.locks.Lock (重入锁 ReentrantLock)的异同

1.Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如锁投票、定时锁等候、可中断锁等候等 2.synchronized 是Java 语言层面的,是内置的关键字;Lock 则是JDK 5中出现的一个包,在使用时,synchronized 同步的代码块可以由JVM自动释放;Lock 需要程序员在finally块中手工释放,如果不释放,可能会引起难以预料的后果(在多线程环...

qq_41799291的博客 443

java concurrent 锁_Java并发编程:Concurrent锁机制解析

Java并发编程:Concurrent锁机制解析前面,我们讲了Java自带的对象锁机制。因为我们的方法必然是在一个对象中的,所以,通过对象的锁,可以很好的控制对方法的调用。当对象的锁被一个线程持有后,其他线程想要调用该对象的该方法,就必须进入等待池,等待当前线程执行完毕后,由系统来决定选中谁接下来继续执行。这种方法非常的直观,原理也非常的清晰。那么,Doug Lea为什么会额外再开发一个并行包呢?...

weixin_39934257的博客 265
上一篇: Java 谜题 ——异常谜题
下一篇: BigDecimal 精确计算
feiyu8607
博客等级 码龄18年 26粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值