Java:从同步块启动新线程时会发生什么?
这里的第一个问题:这是Java中一个非常简短但基本的东西,我不知道 在以下情况下,Java:从同步块启动新线程时会发生什么?,java,multithreading,synchronization,locking,Java,Multithreading,Synchronization,Locking,这里的第一个问题:这是Java中一个非常简短但基本的东西,我不知道 在以下情况下,run()方法是否以某种方式使用somemethod()获得的锁执行 public synchronized void somemethod() { Thread t = new Thread( new Runnable() { void run() { ... <-- is a lock held here ? } }
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)
...
}
public方法(){
线程t=新线程(新的可运行线程(){
无效运行(){
…否,只有原始线程有锁(因为实际上只有一个线程可以持有锁)。否。run()
在自己的上下文中启动,即同步方式。它不持有任何锁。如果持有任何锁,则可能会出现死锁,或者会违反规定,即在任何给定时间只有一个线程可以持有对象上的锁
如果run()
要在同一个对象上再次调用somemethod()
,它必须等待创建它的somemethod()
调用首先完成。我猜新线程开始与同步方法并行运行
someMethod()仍然拥有自己的锁,这只会防止针对对象的此实例同时调用此方法
线程不会继承锁,只有当线程试图对创建它的对象调用someMethod()时,如果someMethod()当前正在为该对象执行,线程才会被锁禁止。@ammoQ:ok great,+1对您和Xr。我验证了Xr-answer,因为他需要分数:)这就是说,现在我有另一个问题,相关但不同(我发现最好在这里提出一个新问题)