当前位置: 首页 > 知识库问答 >
问题:

在同步中使用内部锁

张嘉佑
2023-03-14

假设d是我们用来调用wait的对象。当线程调用d.wait时,它必须拥有d的内部锁,否则会引发错误。在同步方法中调用等待是获取内部锁的一种简单方法。

那么这是不是意味着两个线程不能同时调用wait()。这里的固有锁是什么意思【提到它是监视器】?但是monitor是如何实现互斥的呢?

一旦线程调用等待,它是否永远持有对象?如果是这样,其他线程使用该锁通知All()怎么样?

如果我们需要在 NotifyAll 期间获取对象,那么为什么所有等待线程都被通知了?它不应该单独通知等待该对象的线程吗?

感谢任何要解释的代码。

共有3个答案

丁善
2023-03-14

根据javadoc的说法,锁并不是永久持有的:

线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知在该对象监视器上等待的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

端木兴国
2023-03-14

同步方法中调用等待是获取内在锁的一种简单方法。

Wait不提供对象上的锁,而是在其他线程调用通知时让线程等待侦听锁释放。线程在进入受保护的//同步块时获得锁。同步块/方法允许获取锁(如果可用),否则线程无法进入这些代码块。

慕宜民
2023-03-14

那么这是不是意味着两个线程不能同时调用等待()呢?

更正两个线程不能同时调用wait()。然而,一旦一个线程处于wait()状态,另一个线程可以获取相同的锁,并在不久后进入wait(()状态。同一个对象上可以有任意数量的线程等待,但只有一个线程真正持有锁。

这里的内在锁是什么意思[将其称为监视器]?但是,监控器是如何实现相互排斥的呢?

持有对象时只能运行一个线程。其他线程可能会阻塞试图获取锁,更html" target="_blank">多线程可能会等待()。

一旦线程调用wait,它会永远保持对象吗?

相反,它放弃它,或者另一个线程几乎可以立即获取它。

如果是这样,那么使用notifyAll()锁的其他线程会怎么样呢?

如果在对象上调用notifyAll(),所有等待()的线程依次被唤醒。这些线程一次只能获取一个锁,并且会尽快重新获取锁。

如果我们需要在通知期间获取对象,那么为什么所有等待线程都通知?

这就是notifyAll所做的,它被认为比使用notify更安全,因为它不太容易发生编码错误,所以会唤醒随机的通知。

它不应该通知单独等待该对象的线程吗?

这就是它所做的。

您应该注意;

  • 在notify()/notifyAll()之前,您应该执行状态更改。您还应该在检查状态变化的循环中等待()。您需要这样做,因为a)wait()可能会错过一个notify(),b)它可能会被恶意唤醒c)另一个线程可能会抓取您已经完成的任何操作,它可能需要再次等待
  • 在过去9年中,高级并发类的使用越来越多。使用这些类意味着您不需要直接使用Threads、Queues、wait()和notify()
 类似资料:
  • 问题内容: 我希望这将是足够的信息,所以就在这里。如果您需要更多信息,请在评论中了解。 我有一班有两个内部班。内部类每个都有两个方法来调用外部类中的方法。因此,它看起来像这样: 重要的是要注意: 这是针对Android应用的。的实例,并传递给作为网页视图一个JavaScript接口,所以并可以随时调用,没有特定的顺序。 目前,我在使用现有代码(不使用synced关键字)时遇到了一个问题,该问题在同

  • 问题内容: 在Java中,在代码中声明关键部分的惯用方式如下: 几乎所有块都在上同步 ,但这是否有特定原因?还有其他可能性吗?是否有关于同步对象的最佳实践?(例如?的私有实例) 问题答案: 首先,请注意以下代码段是相同的。 和: 做 完全一样的事情 。除了代码的可读性和样式之外,它们都不是其中之一。 当您同步方法或代码块时,重要的是要知道 为什么 要这样做,要锁定的 对象 到底是 什么,目的 是

  • 信号量 这是本章的第三部分 chapter,本章描述了内核中的同步原语,在之前的部分我们见到了特殊的 自旋锁 - 排队自旋锁。 在更前的 部分 是和 自旋锁 相关的描述。我们将描述更多同步原语。 在 自旋锁 之后的下一个我们将要讲到的 内核同步原语是 信号量。我们会从理论角度开始学习什么是 信号量, 然后我们会像前几章一样讲到Linux内核是如何实现信号量的。 好吧,现在我们开始。 介绍Linux

  • 9.4. 内存同步 你可能比较纠结为什么Balance方法需要用到互斥条件,无论是基于channel还是基于互斥量。毕竟和存款不一样,它只由一个简单的操作组成,所以不会碰到其它goroutine在其执行"期间"执行其它的逻辑的风险。这里使用mutex有两方面考虑。第一Balance不会在其它操作比如Withdraw“中间”执行。第二(更重要)的是"同步"不仅仅是一堆goroutine执行顺序的问题

  • Introduction 这一部分为 linux-insides 这本书开启了新的章节。定时器和时间管理相关的概念在上一个章节已经描述过了。现在是时候继续了。就像你可能从这一部分的标题所了解的那样,本章节将会描述 Linux 内核中的同步原语。 像往常一样,在考虑一些同步相关的事情之前,我们会尝试去概括地了解什么是同步原语。事实上,同步原语是一种软件机制,提供了两个或者多个并行进程或者线程在不同时

  • 我是web服务开发的初学者。我们正在使用Spring3用java构建RESTWeb应用程序。 我们正在使用的Web服务具有异步登录方法。我们为他们提供了一个回调监听器URL,他们的服务在其中发回响应。 因此,当我们发送登录请求时,我们会收到一个空白响应作为确认。和服务发送一个响应,其中包含侦听器URL上的实际数据。 请帮助,我应该如何设计/实现调用登录服务作为同步调用?谢谢 编辑:下面是回发消息的