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

等待()如何让锁回到Java

牧熙云
2023-03-14

这是一个提倡的范例,即 wait() 应该在同步块内的 while 循环中调用

我的问题是,waiting()线程如何获得锁?

// Thread 1
    synchronized (mon) {
     while (!condition) 
          mon.wait();

    // Do something
    }

//Thread 2
    synchronized (mon) {//set condition appropriately
            mon.notify();
    }

考虑线程1首先运行并开始等待条件。它释放锁,线程2获得锁设置条件并通知线程1。现在线程1获得锁,检查条件并开始执行“做某事”。

我的问题是当线程1被通知它从time条件开始执行时,已同步(mon)的代码行永远不会再次执行,那么线程1如何获得锁?将锁还给线程1的内部动态是什么?

共有3个答案

孙鑫鹏
2023-03-14

在线程1被通知后,它立即获得锁并开始运行//做一些事情。

当线程1等待时,它只是暂时释放锁,当通知线程时,它可以再次获得锁,不需要运行同步(…)。

戚修雅
2023-03-14

< code>synchronized(mon)不是一个必须执行的表达式。

它是源代码中的一个语法元素,告诉编译器(然后是运行时)只有在当前线程获取了与< code>mon关联的锁之后,才能执行代码的包装部分,即使您不是“来自”synchronized块之前的代码行。

wait()释放锁,并且必须在返回之前重新获取它。

那安宁
2023-03-14

当Thread1收到通知时,线程必须在退出等待方法之前获取锁,请参阅Object#etc的java文档:

然后,从此对象的等待集中删除线程 T,并重新启用线程调度。然后,它以通常的方式与其他线程竞争在对象上同步的权利;一旦它获得了对对象的控制权,它对该对象的所有同步声明都将恢复到原状 - 即,恢复到调用等待方法时的情况。然后,线程 T等待方法的调用中返回。因此,从 wait 方法返回时,对象和线程 T 的同步状态与调用 wait 方法时完全相同。

 类似资料:
  • 问题内容: 当使用简单的回调(例如下面的示例)时: 如何更改功能以使用异步/等待?具体来说,假设“ someEvent”被保证只能被调用一次,那么我希望函数测试是一个异步函数,该异步函数在执行回调之前不会返回,例如: 问题答案: 不是魔术。异步函数是可以为您解开Promises的函数,因此您需要返回一个Promise才能起作用。像这样: 然后 但这也是一个谎言,因为异步函数也返回Promises本

  • 使用以下示例中的简单回调时: 如何将函数更改为使用异步/等待?具体地说,假设某个事件保证被调用一次并且只有一次,我希望函数测试是一个异步函数,直到执行回调才返回,例如:

  • 我正在尝试为我的频道制作IRC机器人。我希望机器人能够从控制台接收命令。为了让主循环等待用户输入内容,我添加了循环: 这似乎不起作用。我听说过BufferedReader,但我从未使用过,也不确定这是否能解决我的问题。

  • 问题内容: 如何让selenium等待日历小部件的加载?现在,我只是在将测试用例导出到junit程序后进行操作。 问题答案: 我会用 这将一直等待,直到元素出现在DOM中为止。 如果您需要检查元素是否可见,则最好使用

  • 问题内容: 如何让硒等待日历小部件的加载?现在,在将测试用例导出到junit程序后,我只是在做一个。 问题答案: 我会用 这将一直等待,直到元素出现在DOM中为止。 如果您需要检查元素是否可见,则最好使用

  • 在我使用java、ibatic和MySql的项目中。 在将数据更新到数据库中之前,我使用“选择更新”查询锁定表 它使锁定表正确。但问题是,例如,如果两个客户端同时更新表。第一个是锁定表并更新,但第二个是等待更新,直到锁被释放。之后第二个也更新数据。所以,第一个更新的数据被覆盖。请参阅以下解释: 因此,客户端1更新的数据丢失 我想做的是简单地将错误消息返回给客户端2,而不是等待锁释放。 请告诉我解决