java - 可以拥有监视器或锁是否正确?

标签 java multithreading concurrency

我相信我见过“拥有一个监视器”和“拥有一个锁”这样的表达方式。我想验证只有显示器可以被“拥有”。并且锁是“获得”的,而不是拥有的。如果这是错误的,我希望在 Java 多线程上下文中正确使用“own”和“acquire”。

最佳答案

锁是一种数据,逻辑上是堆内存上对象 header 的一部分。JVM 中的每个对象都有这个锁(或互斥体),任何程序都可以使用它来协调多个对象。对对象的线程访问。如果任何线程想要访问该对象的实例变量;那么线程必须“拥有”对象的锁(在锁内存区域中设置一些标志)。所有其他尝试访问该对象变量的线程都必须等待拥有线程释放对象的锁(取消设置标志)。

一旦线程拥有锁,它就可以多次请求同一锁,但随后必须在创建锁之前释放相同次数的锁可供其他线程使用。例如,如果一个线程请求锁三次,则该线程将继续拥有该锁,直到它“释放”三次。

监视器是一种同步构造,允许线程同时具有互斥(使用锁)和协作,即能够使线程等待某些条件为真(使用等待集)。

换句话来说,除了实现锁的数据之外,每个 Java 对象在逻辑上都与实现等待集的数据相关联。锁帮助线程独立处理共享数据而不会相互干扰,而等待集则帮助线程相互合作,共同实现一个共同的目标,例如:所有等待线程都将移至此等待集,并且一旦释放锁,所有等待线程都将收到通知。此等待集有助于在锁定(互斥体)的额外帮助下构建监视器。

enter image description here

关于java - 可以拥有监视器或锁是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933681/

相关文章:

ios - 如何在后台线程 iOS 中运行一个进程

java - 对 volatile 的写入是 Java 中的内存屏障吗

c# - 多个并发请求之间的 token 共享 C#

Java JDBC SQL 异常

java - 如何在 Java 中实现 Scrypt?

java - 在类 block 内声明和实例化

java - 如何在java中优化素数生成器?

multithreading - 在 go 中一次处理许多 GET 请求

java - 在java中将main函数args放入线程内

concurrency - Couchbase 读/写并发