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_Synchronization_Locking_Monitor - Fatal编程技术网

Java 监控和锁定澄清

Java 监控和锁定澄清,java,multithreading,synchronization,locking,monitor,Java,Multithreading,Synchronization,Locking,Monitor,我抓住了同步的概念如下:Java中的每个对象都有一个监视器和一个锁。锁是线程可以获取或释放的实体,而监视器是实例的机制,它决定线程是否可以获取对象的锁 我想澄清一下下面的例子。 首先,我想创建两个对象: MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); 每个实例都有自己的监视器和锁吗?还是共享的 如果我在类上同步: synchronized (MyClass.class) { ... } 它将如何

我抓住了同步的概念如下:Java中的每个对象都有一个监视器和一个锁。锁是线程可以获取或释放的实体,而监视器是实例的机制,它决定线程是否可以获取对象的锁

我想澄清一下下面的例子。 首先,我想创建两个对象:

  MyClass obj1 = new MyClass();
  MyClass obj2 = new MyClass();
每个实例都有自己的监视器和锁吗?还是共享的

如果我在类上同步:

  synchronized (MyClass.class) {
     ...
  }

它将如何表现?此同步是否会阻止获取obj1和obj2锁?如果是,Java中是否有锁层次结构

跟进:说出“对象的监视器”或“对象的锁”的正确方式是什么

Java中的每个对象都有一个监视器和一个锁

听起来不对。每个物体都有一把锁。有些人把锁叫做“监视器”。监视器是过去的一个想法,从来没有得到太多的关注,但回到Java创建时,实现者认为监视器将是下一个重要的东西。基本上,监视器是一个对象,其方法都是同步的

每个实例是否都有自己的。。。锁

如果我在一个类上同步。。。它将如何表现

类是一个对象

您的示例中有三个不同的对象<代码>obj1,
obj2
,和
MyClass.class
。这些对象中的每一个都有自己的锁,它们的锁根本不相互作用


如果我在类上同步。。。它将如何表现?此同步是否会阻止获取obj1和obj2锁

如果您在
MyClass.class
上同步,它将仅与在
MyClass.class
上同步的其他尝试同步。因此,锁定
obj1
obj2
将无效

如果是,Java中是否有锁层次结构

不,Java中没有锁层次结构

“对象的监视器”或“对象的锁”的正确说法是什么


通常人们在谈论同步时只提到“对象的锁”。当您开始使用
wait()
notify()
时,监视器开始发挥作用,但这是另一个主题。

“此同步是否会阻止获取obj1和obj2锁”否。它只获取
MyClass.class
上的锁,该锁是由
obj{1,2}.getClass()返回的
class
的实例
。看到这个:,它回答了你的问题。监视器和锁是一样的,如果我想同步对静态字段或方法的访问,那么我应该使用
synchronized(MyClass.class)
?如果是这样,那么它还会同步类的非静态成员吗?@Anton唯一重要的是,如果您希望不同的线程同步对同一共享数据的访问,那么您需要确保所有线程在同一对象上同步。如果要保护的数据是通过某个类的
静态
字段访问的,那么通过同一类的
最终静态
字段访问锁显然是实现这一点的方法。