2015-01-10 64 views
1

“this”对象对于两个线程是不同的,因为它们是两个不同的对象。因此,他们正在检查两个不同的锁,因此也不应该在平行的一个关键部分停止投放:为什么synchronized(this)有效?

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

我怎么错过?

+2

你错过了很多。此语句引用线程输入的业务对象。它与线程实例无关。 synchronized(this)一次只允许一个线程输入该对象的代码块。 – tmn

回答

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(); 
    } 
} 
+0

你的例子说得很清楚,我认为“this”是Thread对象,因为我读的文章只提供了一小段代码。 – huehuehuehue

0

你不会错过任何东西。如果您的线程尝试应用​​并尝试锁定两个不同对象的监视器,则它们不会彼此阻塞。

2

如果您有一个关键部分,它通常涉及单个对象。在这些情况下,如果两个不同的实例并行运行,则不存在竞争条件,假设它们只处理实例本地资源(例如专用字段)。

您可能错过的是,如果同一类型的对象在共享资源上工作,synchronized(this)确实不会阻止它们并行访问它。在这种情况下,您可以使用synchronized(MyFoo.class) { }或共享变量对类本身进行同步。

+0

感谢提示 – huehuehuehue

0

Java中的每个对象都有一个锁机制,一次只能有一个线程占用锁。当用同步(this)包围代码块或向方法添加同步关键字时,它只会将一个线程限制为该对象的同步区域。它与线程实例无关,同一类的两个实例也不共享锁。

0

如果同一对象的多个线程调用方法(;那么一次只有一个线程会获得对象的监视器。但如果有不同 - 同一类型的不同对象,则它们可以并行输入。

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

相关问题