在Java中,显示器和锁有什么区别

2022-09-04 02:21:35

使用synced关键字方法,使用javap命令查看字节码,发现使用了监视器,如果可以在实现同步时调用监视器,这是我的理解,对吧?如果您不这样做,请更正它。它们之间有什么关系?锁和显示器之间有什么关系?


答案 1

锁和同步的官方文档中:

  • 同步是围绕称为内部锁监视器锁的内部实体构建的。(API 规范通常将此实体简称为“监视器”。
  • 每个对象都有一个与之关联的固有锁。按照惯例,线程必须在访问对象的监视器锁之前获取它们,然后在完成它们时释放监视器锁。据说线程在获取锁和释放锁之间拥有锁。只要一个线程拥有监视器锁,其他任何线程都不能获得相同的锁。另一个线程在尝试获取锁时将阻塞。
  • 当线程释放锁时,将在该操作和同一锁的任何后续获取之间建立“发生之前”关系。

因此,显示器和锁不能进行比较的差异,而是它们是互补的。Java 中的每个对象都与线程可以锁定解锁的监视器相关联。


答案 2

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

一旦一个线程拥有一个锁,它可以多次再次请求相同的锁,但随后必须释放相同的次数,然后才能将其提供给其他线程。例如,如果一个线程请求锁三次,则该线程将继续拥有该锁,直到它“释放”该锁三次。

请注意,当线程明确要求锁定时,它是由线程获取的。在Java中,这是使用sync关键字或等待和通知来完成的。

显示器

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

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

有关更多说明,请参阅 -

了解线程、监视器和锁

锁定和监视器之间的区别 – Java 并发


推荐