【发布时间】:2016-12-23 06:47:51
【问题描述】:
鉴于类的每个实例只有一个锁,那么为什么 Java 不允许我们这样做:
void method() {
synchronized {
// do something
}
// do other things
}
而不是这个:
void method() {
synchronized (lock) {
// do something
}
// do other things
}
指定锁的目的是什么?如果我选择一个对象作为另一个对象的锁,会有所不同吗?或者我可以随意选择任何对象吗?
编辑:
事实证明,我对同步方法的理解在基础层面上是错误的。
我认为不同的同步方法或块是完全独立的,与锁无关。相反,所有具有相同锁的同步方法或块只能由一个线程访问,即使这些同步方法/块来自不同的类(文档应该更多地强调这一点:ALL synced methods/块,无论位置如何,最重要的是锁)。
【问题讨论】:
-
如果我选择一个对象作为另一个对象的锁,会有所不同吗? 是的,当然会有所不同。如果目标是将 this 用作锁,则使用 synchronized(this)。这就是常规同步方法的作用:它们在此同步。
-
锁自己的前门或邻居的前门有区别吗?当然重要。如果你锁错了门,人们仍然可以进入你的房子。
-
它只是任何随机对象,但它很重要,因此您可以拥有 2 个单独的互斥,例如,允许 2 个线程访问 2 个不同的方法,但每个方法一次只能访问一个线程。因此,两者在技术上是同步的。
标签: java concurrency synchronized