了解 Java 中的锁用法

Posted

技术标签:

【中文标题】了解 Java 中的锁用法【英文标题】:Understanding locks usage in Java 【发布时间】:2021-06-27 14:41:44 【问题描述】:

我试图了解 Java 中同步和锁之间的区别,但我发现了另一个我仍然不完全理解的问题: What is the equivalent of synchronized( object ) in Reentrant lock in Java?

特别是我不明白为什么 lock.lock() 被写在了 try 块之外。

据我了解,锁是在方法体中使用的,lock.lock() 被写为 try 块中的第一件事,以确保一次只有一个线程可以执行该 try 块中的内容,直到lock 是通过 lock.unlock() 调用解锁的,它写在 try 块之后的 finally 块中。

但是如果 lock.lock() 在方法体之外和块之外被调用,那是什么意思呢?

【问题讨论】:

【参考方案1】:

try-finally 构造是为了保证锁会被释放。

'lock' 写在 'try' 之前的原因是,在锁定完成之前,没有什么可以解锁 - 所以有一个 finally 子句无条件解锁可能没有被锁定的东西是一个错误。

【讨论】:

感谢您的回答,我现在明白为什么必须在尝试块之前编写它。那么在方法体之外编写的 lock.lock() 调用又如何呢?是否存在有意义的情况? 您可以在方法体之外执行代码的唯一地方是在构造函数中或等效地在初始化程序中。这样做可能有一些用例,但这并不常见,我无法想到任何事情,并且无论如何接下来的问题将是“锁的范围是什么? "和“解锁在哪里?”。

以上是关于了解 Java 中的锁用法的主要内容,如果未能解决你的问题,请参考以下文章

java中synchronized关键字的用法

synchronized

多线程中的锁的几种用法总结

SQL Server中的锁类型及用法

Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景

Java学习笔记之二十final关键字在Java继承中的用法小结