为什么synchronized(this)有效?

时间:2015-01-10 04:38:38

标签: java

" this"两个线程的对象是不同的,因为它们是两个不同的对象。所以他们正在检查两个不同的锁,所以没有什么能阻止他们并行运行一个关键部分:

void method() {
    synchronized(this) {
        //critical section
    }
}

我想念什么?

5 个答案:

答案 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();那么一次只有一个线程会得到对象的监视器。但如果有不同的 - 相同类型的不同对象,那么它们可以以并行方式进入。

当你有任何类变量时,这个代码中唯一的问题就会发生,所以当你必须使用类级别锁定时,这个问题将被共享。