Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以拥有监视器或锁的说法正确吗?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 可以拥有监视器或锁的说法正确吗?

Java 可以拥有监视器或锁的说法正确吗?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我相信我见过“拥有一台显示器”和“拥有一把锁”这两个词。我想确认只有一个监视器可以被“拥有”。锁是“获得的”,而不是拥有的。如果这是错误的,我希望在Java多线程环境中正确使用“own”和“acquire”。如果锁没有共享(即只能获取一次),那么当前持有单个锁的人就是锁的“所有者” 在synchronized块的情况下,只允许一个线程同时获取锁(这就是本文的全部目的)。因此线程将“拥有锁”。锁是一种数据,在逻辑上是堆内存中对象头的一部分。JVM中的每个对象都有这个锁(或互斥锁),任何程序都可以使

我相信我见过“拥有一台显示器”和“拥有一把锁”这两个词。我想确认只有一个监视器可以被“拥有”。锁是“获得的”,而不是拥有的。如果这是错误的,我希望在Java多线程环境中正确使用“own”和“acquire”。

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


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

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

一旦一个线程拥有了一个锁,它可以多次再次请求同一个锁,但是在其他线程可以使用该锁之前,它必须释放该锁相同的次数。例如,如果一个线程请求了三次锁,那么该线程将继续拥有该锁,直到它“释放”了三次锁为止

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

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


我认为,在内部拥有一个锁会导致拥有相关锁的监视器。我一直在交替使用它们。不知道这会不会有什么不同。谢谢。那么监视器呢?锁和监视器在这里几乎可以互换。@Julian在Java中我们有锁,它是使用监视器实现的,监视器是操作系统支持的组件。虽然所有对象都有一个锁,但只有那些使用它的对象才有一个监视器(因为每个监视器都相对昂贵)@PeterLawrey“…只有那些使用它的对象才有监视器”-你的意思是说“只有使用它的对象才有监视器”?“如果任何线程想要访问该对象的实例变量,那么线程必须“拥有”对象的锁”。好的,这将取决于作为开发人员的您(通过使用
synchronized
块)来实施。线程安全不是由JVM为您管理的,因此,如果您愿意,可以在不使用任何锁的情况下读取实例字段,并且在许多情况下,不需要取出锁(或者使用更粗粒度的锁就足够了)。