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

条件锁定在通知后和释放前发生了什么

党宇定
2023-03-14
# Consume one item (thread 1)
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()

# Produce one item (thread 2)
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()

我在https://stackoverflow.com/a/17337630/1497720中发现,但它是针对Java的:

这维护了两个datastructures-一个等待集和一个条目集。等待线程被添加到等待集中并停放,而试图获取监视器的线程被添加到条目集中并停放。在通知时,从等待集中取出一个线程并将其添加到条目集中。当线程释放锁时,如果有一个线程,它会从条目集中释放一个线程。请注意,这些集合实际上是作为队列(链表)实现的,因此在FIFO的基础上进行处理。

共有1个答案

海新霁
2023-03-14

condition.notify的文档中:

注意:唤醒的线程在重新获得锁之前不会从其wait()调用返回。由于notify()不释放锁,它的调用者应该释放锁。

因此,在调用cv.notify()之后,但在调用cv.release()之前,线程1仍然在cv.wait()处被阻塞。

 类似资料:
  • 问题内容: 我对等待和通知/ notifyAll感到有些困惑。 我知道每个Java对象都有一个锁。我知道等待将释放其他线程的锁。notify / notifyall怎么样?notify / notifyAll是否释放它为其他线程持有的锁? 问题答案: 否- / 不要像那样释放锁。唤醒的线程直到调用的代码释放其锁后才能运行。 这就是Javadoc所说的: 该线程释放此监视器的所有权,并等待直到另一个

  • 问题内容: 我在使用Java在Windows中删除文件时遇到一些问题。由于某种原因,java会锁定我的文件,但我不知道为什么。这是我的代码: file.delete()以及在资源管理器中手动尝试拒绝删除该文件,因为它仍在使用中。尽管在Linux中一切似乎都很好。 我在某处缺少close()吗?我可以确认首先使文件成为关闭文件的方法,因为我可以在使用file.delete()运行上述代码之前删除文件

  • SQLite具有不同级别的锁:、、、、。 我找不到调用SQLite API获取和释放锁定的信息。 据我所知,调用sqlite3\U步骤时获得锁。锁的类型取决于预处理语句的表达式。此外,此命令还可以升级自定义事务内的锁定写入操作。 据我所知,写入锁也是由sqlite3\u步骤释放的-此函数返回SQLITE\u DONE或错误代码。我没有找到任何文档,但该函数应该在执行结束时释放保留的待处理的独占的。

  • 我有以下代码: 假设线程1调用synchornizer.await()并通过 和块在 然后,另一个线程2调用synchronizer.signalAll()以向线程1发送信号。我的问题是线程2如何通过调用 打电话之前 锁最初是由线程 1 获取的? 我在这里发现了同样的问题: 等待可重入锁中的条件 答案是: “锁定”和“已同步”都暂时允许其他人在等待时获取锁定。要停止等待,线程必须重新获取锁。 我试

  • 我从过去几个月开始使用spring,我有一个关于交易的问题。我在我的spring批处理作业中有一个java方法,它首先执行一个select操作以获取前100行,状态为“未完成”,并对所选行进行更新以将状态更改为“进行中”。由于我正在处理大约1000万条记录,我想运行批处理作业的多个实例,每个实例都有多个线程。对于单个实例,为了确保两个线程不会获取同一组记录,我将方法设置为同步。但是,如果我运行批处

  • 问题内容: 我正在按照以下指南使用jGit克隆远程现有存储库: https://github.com/centic9/jgit- cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepository.java 我在示例中使用CFML: 克隆的效果很好,但是在我停止Java进程之前,文件锁不会释放在其