当前位置: 首页 > 面试题库 >

使用ReentrentLock和Synchronized(object)有什么区别?

束帅
2023-03-14
问题内容

我想知道使用ReentrentLock和Synchronized(object)有什么大不同吗?

为什么叫reentrentLock?允许来自同一线程的递归调用?


问题答案:

我想知道使用ReentrantLock和会有很大的不同synchronized (object)

主要区别在于:

  • synchronized锁定/解锁绑定到源代码的块结构。synchronized无论您如何执行此操作,退出块时都会释放一个锁。例如,如果块由于意外的异常而终止,它将被释放。

使用显式锁定不是这种情况,因此您可以在一种方法中获取一个ReentrantLock(或任何其他Lock)并在另一种方法中释放它。但另一方面,您
必须
记住Lock在适当的时间/地点显式释放。如果不这样做,您将最终陷入困境,甚至陷入僵局。简而言之,ReentrantLock它更复杂,并且更容易出错。

  • 您获得的原始锁定synchronized可用于Object.wait()Object.notify()Lock不。

  • ReentrantLock可以将A 创建为“公平”的,这意味着等待获取给定锁的线程将按fifo顺序获取锁。原始锁是不公平的。

  • ReentrantLockAPI的方法可用于测试锁是否正在使用,找出锁队列的长度,尝试不加阻塞地获取锁以及其他各种方法。此功能均不可用于原始锁。

为什么将其称为可重入锁?允许来自同一线程的递归调用?

可重入锁允许持有锁的线程再次获取它。可能发生这种情况的一种方法是通过递归,但是还有其他方法。

作为记录,synchronized锁也是可重入的,因此您不必担心递归或线程可能获取其已持有的锁的其他情况。



 类似资料:
  • 本文向大家介绍synchronized 和 Lock 有什么区别?相关面试题,主要包含被问及synchronized 和 Lock 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁

  • 问题内容: 原子/易失性/同步在内部如何工作? 以下代码块有什么区别? 代码1 代码2 代码3 是否volatile以以下方式工作?是 相当于 我认为两个线程不能同时进入同步块…对吗?如果这是真的,那么atomic.incrementAndGet()没有它synchronized怎么办?而且它是线程安全的吗? 内部读写可变变量/原子变量之间有什么区别?我在某些文章中读到,线程具有变量的本地副本-那

  • 问题内容: 和之间有什么区别? 对于: 问题答案: 调用(或其别名)时,您将bash脚本加载并执行 到 当前 bash进程中。所以你可以 读取在源脚本中设置的变量, 使用其中定义的功能。 甚至在脚本执行的情况下执行fork和/或子进程。 调用时,您将启动一个 fork (子进程或 子 进程),该 fork 运行新的会话,通常是的符号链接。在这种情况下,子脚本完成时将删除由子脚本设置的环境变量。 注

  • 本文向大家介绍使用PropTypes和Flow有什么区别?相关面试题,主要包含被问及使用PropTypes和Flow有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 Flow 是一个针对react项目所有 JavaScript 代码的静态类型检测器,需要单独添加依赖并手动运行 PropTypes是针对组件级别的类型检测

  • 我是Rust的新手。我认为用于将标识符导入当前范围,用于声明外部模块。但是这种理解(可能是错误的)对我来说没有任何意义。有人能解释一下为什么Rust有这两个概念以及适合使用它们的情况吗?

  • 问题内容: 我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法: 由于所有对象都扩展了对象,所以这两种用法是同义词吗? 问题答案: 并且是同义的,正如你所期望的。 在某些情况下,泛型实际上并不是多余的。例如,将导致成为下删除,而与它会成为下删除。(如果你要保留与使用的前泛型API的兼容性,这可能很重要。) 来源:http : //download.oracle.com/javase/tu