这里的第一个问题:我不知道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)
...
}
答案 0 :(得分:11)
没有。 run()
以同步方式在自己的上下文中启动。它没有任何锁定。如果确实如此,你可能会遇到死锁,或者它违反规范,规定在任何给定时间只有一个线程可以锁定对象。
如果run()
要在同一个对象上再次调用somemethod()
,则必须等待创建它的somemethod()
调用首先完成。
答案 1 :(得分:5)
不,只有原始线程有锁(因为实际上只有一个线程可以持有锁)。
答案 2 :(得分:0)
我猜测新线程开始与synchronized方法并行运行。
someMethod()仍然拥有自己的锁,只能防止对该对象实例同时调用此方法。
线程不会继承锁,只有当线程尝试对创建它的对象调用someMethod()时,如果当前正在为该对象执行someMethod(),则线程将禁止该锁。