【问题标题】:Is it correct to say a monitor or lock can be owned?说可以拥有监视器或锁是否正确?
【发布时间】:2016-03-11 06:30:15
【问题描述】:

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

【问题讨论】:

  • 我认为在内部拥有锁会导致拥有相关锁的监视器。我一直在交替使用它们。不确定它是否有任何区别。

标签: java multithreading concurrency


【解决方案1】:

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

一旦一个线程拥有一个锁,它可以多次再次请求同一个锁,但必须释放相同次数的锁才能生成可用于其他线程。例如,如果一个线程请求锁 3 次,则该线程将继续拥有该锁,直到它 “释放” 3 次。

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

换句话说,与实现锁的数据一起,每个 Java 对象在逻辑上都与实现等待集的数据相关联。锁帮助线程在共享数据上独立工作而不会相互干扰,而等待集帮助线程相互合作以实现共同目标,例如所有等待的线程都将被移动到这个等待集,一旦锁被释放,所有的线程都会得到通知。此等待集有助于在锁定(互斥)的额外帮助下构建监视器。

【讨论】:

  • “如果任何线程想要访问该对象的实例变量;那么线程必须“拥有”该对象的锁”。好吧,这将由您作为开发人员来强制执行(通过使用synchronized 块)。线程安全不是由 JVM 为您管理的,因此如果您愿意,您可以在没有任何锁的情况下读取实例字段,并且在许多情况下不需要取出锁(或者足以使用更粗粒度的锁) .
【解决方案2】:

如果锁不是共享的(即只能获取一次),那么当前持有单个锁的人就是锁的“所有者”。

synchronized 块的情况下,只允许一个线程同时获取锁(这就是这里的全部目的)。这样线程将“拥有锁”。

【讨论】:

  • 谢谢。那么显示器呢?
  • 锁定和监控在这里是可以互换的术语。
  • @Julian 在 Java 中,我们有锁,它是使用监视器实现的,监视器是操作系统支持的组件。虽然所有对象都有锁,但只有那些使用它的对象才有监视器(因为每个监视器都相对昂贵)
  • @PeterLawrey “......只有那些使用它的对象才有监视器” - 你的意思是说“只有使用它的对象才有监视器”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2023-03-14
  • 2018-01-29
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多