为什么我在使用同步块时需要传递“this”?同步部分的目的是什么?
5 回答
因为synchronized
需要一个对象来锁定。this
和其他任何东西一样方便,或者您可以说Object lock = new Object()
并在 .sync 上同步lock
。
或者,您可以将您的方法标记为synchronized
.
Java 同步块构造采用括号中的对象。“this”是调用哪个方法的实例。同步构造中括号中的对象称为监视器对象。据说代码在监视器对象上是同步的。同步实例方法使用它所属的对象作为监控对象。
只有一个线程可以在同一个监视器对象上同步的 Java 代码块内执行。
同步将在您指定的对象上完成,这意味着如果两个线程在同一个对象上同步,一次只能运行一个代码块。
它可以是任何对象,尽管它通常是this
.
例如,这使您可以在同一类中的不同对象上进行同步。
syntexsynchronized(objectLock) { }
不是this
必需的,我们需要传递一个对象,在多个线程试图运行同一个同步块的情况下,我们希望对其进行独占访问。这样,如果在任何时间点,有 2 个或多个线程尝试访问同步块,则传递的对象(this
在这种情况下为“”)将拥有该块的独占访问权,除非该块执行完成,否则没有其他人可以访问该块。
Synchronize 使用对象引用来锁定一个监视对象。您想要防止同时访问的每个资源都应该有自己的监视器对象。最简单的方法是经常使用this
.