Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从同步块启动新线程时会发生什么?_Java_Multithreading_Synchronization_Locking - Fatal编程技术网

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 ? } }

这里的第一个问题:这是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)
    ...
}
public方法(){
线程t=新线程(新的可运行线程(){
无效运行(){

…否,只有原始线程有锁(因为实际上只有一个线程可以持有锁)。否。
run()
在自己的上下文中启动,即同步方式。它不持有任何锁。如果持有任何锁,则可能会出现死锁,或者会违反规定,即在任何给定时间只有一个线程可以持有对象上的锁


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

我猜新线程开始与同步方法并行运行

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


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

@ammoQ:ok great,+1对您和Xr。我验证了Xr-answer,因为他需要分数:)这就是说,现在我有另一个问题,相关但不同(我发现最好在这里提出一个新问题)