两个线程的“this”对象是不同的,因为它们是两个不同的对象。所以他们正在检查两个不同的锁,所以没有什么可以阻止他们并行运行关键部分:
void method() {
synchronized(this) {
//critical section
}
}
我错过了什么?
最佳答案
如果您有临界区,它通常涉及单个对象。在这些情况下,如果两个不同的实例并行运行,则不存在竞争条件,假设它们仅适用于实例本地资源,例如私有(private)字段。
您可能错过的是,如果相同类型的对象在共享资源上工作,synchronized(this) 确实不会阻止它们并行访问它。在这种情况下,您可以使用 synchronized(MyFoo.class) { }
或共享变量在类本身上进行同步。
关于java - 为什么 synchronized(this) 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27872904/