我在不同的博客中读到了关于显示器的不同观点,所以现在有点困惑。
据我所知,显示器是确保只有一个线程执行临界区代码的人。那么,如果我们有3个同步方法/块,那么我们会有3个显示器来确保只有一个线程进入临界区吗?
如果以上说法是正确的,那么为什么要说在Java中每个对象都有与之关联的显示器?应该是每个同步块都有关联的显示器。
我在不同的博客中读到了关于显示器的不同观点,所以现在有点困惑。
据我所知,显示器是确保只有一个线程执行临界区代码的人。那么,如果我们有3个同步方法/块,那么我们会有3个显示器来确保只有一个线程进入临界区吗?
如果以上说法是正确的,那么为什么要说在Java中每个对象都有与之关联的显示器?应该是每个同步块都有关联的显示器。
什么是监视器?
监视器是一个线程可以抓取并保持的东西,阻止所有其他线程从抓取相同的监视器并迫使它们等待直到监视器被释放。这就是synchronized
块的作用。
这些监视器最初从哪里来?
答案是:任何 Java 对象都可以。例如当你写下:
Object foo = new Object();
synchronized (foo) {
System.out.println("Hello world.");
}
...这意味着: 当前线程首先会获取与变量foo
中存储的对象相关联的监视器,并在打印"Hello world"时保持它,然后释放它。
为什么每个Java对象都有与之关联的监视器?
没有技术上的理由。这是在Java早期版本中做出的设计决策,现在已经太晚改变了(即使在最开始它可能会让人感到困惑并且如果使用不当会引起问题)。
synchronized
方法等同于synchronized(this) {}
,而静态的synchronized
方法使用类对象作为其监视器。 - biziclopSomeClass.class
也是一个对象(确切地说,它是 Class
类的实例),并且该对象用于同步静态方法。 - Pshemosynchronized
时,您需要指定一个对象进行锁定。在这种情况下,该对象的监视器用于锁定。synchronized
时,您不需要指定要锁定的对象,而是隐含地使用this
对象。同样,this
的监视器用于锁定。
synchronized(monitor){...}
声明),而该监视器是一个对象。 - Andy Turner