2010-02-26 52 views
6

第一个问题:它是Java中的一个很短但根本的东西,我不知道......Java:从同步块启动新线程时会发生什么?这里

在下列情况下,与锁somemethod()并获得某种方式执行run()方法?

public synchronized void somemethod() { 
    Thread t = new Thread(new Runnable() { 
     void run() { 
      ...   <-- is a lock held here ? 
     } 
    } 
    t.start(); 
    ... 
    (lengthy stuff performed here, keeping the lock held) 
    ... 
} 

回答

10

No. run()从同步的上下文开始。它没有任何锁。如果是这样,你可能会发生死锁,或者违反规定在任何给定时间只有一个线程可能锁定对象的规格。

如果run()是同一个对象再次调用somemethod(),那就要等待somemethod()调用创建它首先完成。

5

不,只有原始线程有锁(因为实际上只有一个线程可以持有锁)。

+0

@ammoQ:好的,给你和Xr +1。我验证了Xr的答案,因为他需要点:)现在说我有另一个问题,但相关但不同(我已经看到在这里开个新问题更好) – cocotwo

0

我猜测新线程开始与synchronized方法并行运行。

someMethod()仍然拥有自己的锁,它只能防止此方法被同时对该对象实例调用。

线程不会继承锁,并且只有当线程试图针对创建它的对象调用someMethod()时,如果someMethod()当前正在为该对象执行,锁才会禁止该锁。

相关问题