2014-01-29 4 views
0

Предполагая, что класс имеет два метода, как те ниже:Вызов синхронизированного метода из нового потока, созданный внутри другого синхронизированного метода того же класса в Java

public synchronized void methodA() { 
    // do some stuff 

    new Thread() { 
    public void run() { 
     methodB(); 
    } 
    }.start(); 
} 

public synchronized void methodB() { 
    // do some stuff 
} 

и мы называем methodA(), будет новый поток заблокирован тем, который вызвал methodA()?

ответ

3

Вероятно, нет: new Thread().start() возвращается немедленно, так что к тому времени, когда новый поток фактически запускается и methodB() называется, очень вероятно, что исходный поток будет уже вышел methodA().

Если же вы делаете:

public synchronized void methodA() throws InterruptedException { 
    new Thread() { 
    public void run() { 
     methodB(); 
    } 
    }.start(); 
    Thread.sleep(10000); 
} 

вашего methodB будет блокировать в течение примерно 10 секунд, ожидая первоначальный поток, чтобы снять блокировку.

Смежные вопросы