" this"两个线程的对象是不同的,因为它们是两个不同的对象。所以他们正在检查两个不同的锁,所以没有什么能阻止他们并行运行一个关键部分:
void method() {
synchronized(this) {
//critical section
}
}
我想念什么?
答案 0 :(得分:2)
如果你有一个关键部分,它通常涉及一个对象。在这些情况下,如果两个不同的实例并行运行,则没有竞争条件,假设它们仅适用于实例本地资源,例如私有字段。
您可能错过的是,如果相同类型的对象在共享资源上工作,则synchronized(this)确实不会阻止它们并行访问它。在这种情况下,您可以使用synchronized(MyFoo.class) { }
或共享变量同步类本身。
答案 1 :(得分:1)
这是一个示例,它是两个线程的相同对象:
class Test {
void method() {
synchronized(this) {
}
}
public static void main(String[] args) throws Exception {
final Test t1 = new Test();
new Thread() {
public void run() {
t1.method();
};
}.start();
new Thread() {
public void run() {
t1.method();
};
}.start();
}
}
答案 2 :(得分:0)
你不会错过任何东西。如果两个线程都尝试应用synchronized
并尝试锁定两个不同对象的监视器,则它们不会相互阻塞。
答案 3 :(得分:0)
Java中的每个对象都有一个锁机制,一次只有一个线程可以占用锁。当您使用synchronize(this)包围代码块或向方法添加synchronize关键字时,它仅将一个线程限制为该对象的那些同步区域。它与线程实例无关,同一类的两个实例也不共享锁。
答案 4 :(得分:0)
如果同一个Object的多个线程正在调用method();那么一次只有一个线程会得到对象的监视器。但如果有不同的 - 相同类型的不同对象,那么它们可以以并行方式进入。
当你有任何类变量时,这个代码中唯一的问题就会发生,所以当你必须使用类级别锁定时,这个问题将被共享。