管理对共享资源的访问对于并发编程中确保数据一致性非常重要。传统的synchronized关键字对于公平性、立即获取锁、等待特定时间获取锁等复杂场景缺乏灵活性。Java 1.5中引入了Lock、ReadWriteLock和StampedLock API来解决这些限制,并为开发人员提供了很好的控制来处理共享资源访问。它们是 java.util.concurrent 包的一部分。
锁定API
Lock API 是一个接口,提供以下方法来处理线程同步。
- void lock() 用于获取锁。如果锁不可用,线程将被阻塞,直到获取锁。
- void lockInterruptically() 与lock()相同,但该线程可以被中断。
- boolean tryLock() 如果获得锁则返回true;否则为假。如果没有授予锁,线程不会被阻塞。
- boolean tryLock(long timeout, TimeUnit unit) 与 tryLock() 相同,但仅等待指定的时间。
- voidunlock()释放锁。
- Condition newCondition() 为线程提供在执行关键部分时等待某些条件发生的能力。
可重入锁
- ReentrantLock 类实现了 Lock 接口。
- 可重入锁允许线程多次获取锁并多次释放它。
- 如果你想要公平策略,请使用 ReentrantLock 的参数化构造函数。
- 如果启用公平性,它会确保等待时间最长的线程能够访问锁。
- 使用finally块释放锁以避免死锁情况。
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
读写锁API
ReadWriteLock API 是一个接口,维护一对锁来维护读写场景。如果没有写入者,读锁可以由多个线程同时持有。写锁是独占的。
- Lock readLock() - 返回用于读取的锁。
- Lock writeLock() - 返回用于写入的锁。
关键规则
- 如果有读锁,则无法获取写锁。
- 如果拥有写锁,则无法在任何其他线程中获取读锁。
- 如果你有一个写锁,你可以在同一个线程中获取另一个写锁。
- 当没有其他读或写锁处于活动状态时,允许写锁。
- 等待写锁时,不允许来自其他线程的新读锁。
可重入读写锁
- ReentrantReadWriteLock 类实现了 ReadWriteLock 接口。
- 如果我们有更多的阅读量而不是写入量,那么很有用。
示例:在微服务通信中,假设服务 B 需要来自服务 A 的 JWT。JWT 由服务 A 生成,并且可以缓存几分钟。在这种情况下ReentrantReadWriteLock会更有用。如果令牌过期或即将过期,我们可以更新令牌。我在这里不获取读锁以避免读饥饿。
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
印记锁API
StampedLock 是在 Java 8 中引入的,它是一个类。它支持三种锁定模式并返回用于释放锁定的标记。它允许锁升级。
- 读锁允许多个线程并发读取。
- Write Lock 返回用于写入的锁。
- 乐观读锁允许线程在不获取传统读锁的情况下进行读取,从而避免争用,从而提高性能。
- long writeLock() 获取独占锁,必要时阻塞直至可用。
- void unlockWrite(long stamp) 释放写锁。
- long readLock() 获取读锁,如果正在进行写锁则阻塞。
- void unlockRead(long stamp) 释放读锁。
- long tryOptimisticRead() 返回一个稍后可以验证的标记,如果独占锁定则返回零。
- boolean validate(long stamp) 如果自给定戳记发布以来尚未独占获取锁(写锁),则返回 true;否则,错误。
- long tryConvertToWriteLock(long stamp) 将读锁或乐观锁升级为写锁。阻塞直到可用。
要点:
- 它是不可重入,这意味着持有锁的线程无法再次获取它。
- 不支持条件。
- 它不支持公平。
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
乐观的阅读示例。这允许线程在不获取传统读锁的情况下进行读取,从而避免了锁争用,从而提高了性能。如果在获取乐观读锁时间后获取了任何写锁,validate() 将返回 false,否则返回 true。
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
快乐编码和学习!!!
如有任何问题请留言。
以上是java中Lock API概述的详细内容。更多信息请关注PHP中文网其他相关文章!

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生产性。1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允许CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec

JVMhasacloserelationshipwiththeOSasittranslatesJavabytecodeintomachine-specificinstructions,managesmemory,andhandlesgarbagecollection.ThisrelationshipallowsJavatorunonvariousOSenvironments,butitalsopresentschallengeslikedifferentJVMbehaviorsandOS-spe

Java实现“一次编写,到处运行”通过编译成字节码并在Java虚拟机(JVM)上运行。1)编写Java代码并编译成字节码。2)字节码在任何安装了JVM的平台上运行。3)使用Java原生接口(JNI)处理平台特定功能。尽管存在挑战,如JVM一致性和平台特定库的使用,但WORA大大提高了开发效率和部署灵活性。

JavaachievesPlatFormIndependencethroughTheJavavIrtualMachine(JVM),允许Codetorunondifferentoperatingsystemsswithoutmodification.thejvmcompilesjavacodeintoplatform-interploplatform-interpectentbybyteentbytybyteentbybytecode,whatittheninternterninterpretsandectectececutesoneonthepecificos,atrafficteyos,Afferctinginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginging

JavaispoperfulduetoitsplatFormitiondence,对象与偏见,RichstandardLibrary,PerformanceCapabilities和StrongsecurityFeatures.1)Platform-dimplighandependectionceallowsenceallowsenceallowsenceallowsencationSapplicationStornanyDevicesupportingJava.2)

Java的顶级功能包括:1)面向对象编程,支持多态性,提升代码的灵活性和可维护性;2)异常处理机制,通过try-catch-finally块提高代码的鲁棒性;3)垃圾回收,简化内存管理;4)泛型,增强类型安全性;5)ambda表达式和函数式编程,使代码更简洁和表达性强;6)丰富的标准库,提供优化过的数据结构和算法。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver CS6
视觉化网页开发工具