Encadeamentos Java e Blocos Sincronizados

Suponha que estou executando um bloco de código synchronized dentro de algum encadeamento e dentro do bloco synchronized eu chamo um método que gera outro encadeamento para processar um bloco de código sincronizado que requer o mesmo bloqueio que o primeiro método. Então, em pseudo código Java:

 public void someMethod() { synchronized(lock_obj) { // a whole bunch of stuff... // this is the last statement in the block (new Thread(someOtherMethod())).start(); } // some more code that doesn't require a lock } public void someOtherMethod() { // some setup code that doesn't require a lock // return the stuff we want to run in another thread // that does require a lock return new Runnable() { @Override public void run() { synchronized(lock_obj) { // some more code } } }; } 

Não tenho ideia de como entender esse código. O que escrevi é legal? Sintaticamente, não vejo nenhum problema, mas não tenho certeza de como raciocinar através de código como esse. Então, quando executo someOtherMethod() para criar uma instância de Runnable em qual tipo de escopo o código antes da instrução de retorno é executado? Ele é executado como parte do primeiro bloco sincronizado? Suponha que haja alguns outros threads funcionando também que possam requerer o bloqueio em lock_obj .

Você ainda está segurando o bloqueio durante a criação do executável e o encadeamento, mas depois de chamar o início e antes que o encadeamento realmente seja ativado, você estará liberando o bloqueio. O novo segmento terá que competir pelo bloqueio com outros segmentos.

Não há nada de errado com esse código. Antes da instrução de retorno em someOtherMethod() , o código está sendo executado no bloco sincronizado de someMethod() . Depois que o novo encadeamento for iniciado, ele será bloqueado na instrução synchronized dentro do método run() até obter um bloqueio em lock_obj (na melhor das hipóteses, sempre que someMethod() sair do bloco sincronizado).

Se someMethod () é invocado primeiro, é o exemplo clássico de um deadlock.

O que escrevi é legal?
—- Sim, é perfeitamente legal sintaticamente.

Então, quando executo someOtherMethod () para criar uma instância de Runnable em qual tipo de escopo o código antes da instrução de retorno é executado? —- Se o someOtherMethod () é chamado de dentro de someMethod (), então é no escopo do bloco sincronizado do método someMethod ().

Intereting Posts