O deadlock acontece por método ou por class?

Imagino que tenho Classe First com vários methods sincronizados. Quando um thread bloqueia a class First , ele bloqueia por método ou por class? Por exemplo, o deadlock acontece para o código a seguir?

 public class DeadLockQuestion { public static class First{ public synchronized void a(){ } public synchronized void b(){ } public synchronized void c(){ } public synchronized void d(){ } public synchronized void e(){ } } public static void main(String... args){ First f = new First(); //This code is run in Thread 1 fa(); // End //This code is run in Thread 2 simultanously fb(); //End // We have also Threads 3 & 4 & 5 that invoke c,d and e simultanously } } 

Você tem dois bloqueios em Java. Um é o bloqueio de Object . e o outro é o bloqueio de Class . O object lock bloqueia o access apenas a funções não estáticas sincronizadas. Class lock e Class lock apenas em funções estáticas sincronizadas. Para você, é um object lock no object f . Portanto, todas as funções não estáticas sincronizadas são bloqueadas para o object f . Como todos os Threads estão usando o mesmo object f , apenas um thread poderá acessar suas funções não-estáticas a(), b(),... por vez. Leia mais aqui

 does deadlock happen for the following code? 

Não, isso não vai acontecer no seu caso. Porque enquanto um Thread está segurando o bloqueio, outros segmentos não podem entrar na sua function sincronizada. DeadLock happens due to resources.
Você tem apenas um recurso que é Objeto f . Não há nenhum ponto de dead-lock aqui porque a class First não bloqueia outro object e nenhum bloqueio cíclico pode acontecer. Deadlock requer um bloqueio cíclico !

Algumas informações:

  1. Sincronização em java garante que não há dois segmentos podem executar um método sincronizado que requer o mesmo bloqueio simultaneamente ou simultaneamente.
  2. palavra-chave sincronizada pode ser usada apenas com methods e blocos de código. Esses methods ou blocos podem ser estáticos ou não estáticos.
  3. Sempre que um thread entra no método sincronizado java ou bloqueia, ele adquire um bloqueio e sempre que deixa o método sincronizado java ou bloqueia, libera o bloqueio. O bloqueio é liberado mesmo se o segmento sair do método sincronizado após a conclusão ou devido a qualquer Erro ou Exceção.
  4. É possível que tanto o método sincronizado estático quanto o não sincronizado estático possam ser executados simultaneamente ou simultaneamente porque eles bloqueiam objects diferentes.
    Fonte útil aqui e aqui

Deadlock acontece com threads, não para methods ou classs.

Os encadeamentos bloqueados também mantêm bloqueios, mas nesse caso é impossível dizer quais bloqueios porque você não demonstra um cenário de conflito real (se dois encadeamentos chamam methods sincronizados de f um passa e o outro aguarda; o impasse requer pelo menos dois bloqueios ).

Para bloquear cada método de forma independente, use um bloco sincronizado dentro de cada método e bloqueie um object diferente.

Se você tiver um object apropriado (e deve ser final para evitar possíveis problemas) dentro da class, você poderá usá-lo. Se não criar um private final Object aLock = new Object(); e, em seguida, bloquear isso, por exemplo:

 private final Object aLock = new Object(); public void a() { synchronized(aLock) { // Do stuff that needs the lock } // do stuff that doesn't need the lock } 

Sempre segure a trava pelo tempo que você precisar, mas não mais.

Quando a() é um método sincronizado, fa() significa literalmente:

 synchronized(f){ fa(); } 

Então, neste caso, um bloqueio aconteceria para o monitor de object f . No seu caso, você precisaria de um segundo object para criar um deadlock, não acho que seja possível criar um deadlock com um único monitor de object. Um padrão de deadlock típico é quando uma ordem de aquisição de bloqueio não está sendo mantida, ou seja, quando isso acontece em dois segmentos diferentes:

 synchronized(a){ synchronized(b){ ... } } // and synchronized(b){ synchronized(a){ ... } } 

Em primeiro lugar, o deadlock ocorre com threads e não classs ou methods.

O deadlock ocorre quando há uma dependência cíclica de bloqueios .

 Thread A ---> locks L1 ---> tries to lock L2 Thread B ----> locks L2 ------> tries to lock L1 

Fonte da imagem: Plugin de deadlock FusionReactor

insira a descrição da imagem aqui

Intereting Posts