Java:从同步块启动新线程时会发生什么?

时间:2010-02-26 07:37:50

标签: java multithreading synchronization locking

这里的第一个问题:我不知道Java中的这是一个非常简短但基本的东西......

在下面的例子中,run()方法是否以somemethod()确实获得的锁执行了某种方式?

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)
    ...
}

3 个答案:

答案 0 :(得分:11)

没有。 run()以同步方式在自己的上下文中启动。它没有任何锁定。如果确实如此,你可能会遇到死锁,或者它违反规范,规定在任何给定时间只有一个线程可以锁定对象。

如果run()要在同一个对象上再次调用somemethod(),则必须等待创建它的somemethod()调用首先完成。

答案 1 :(得分:5)

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

答案 2 :(得分:0)

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

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

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