public class DeadlockRisk {
private static class Resouce{
public int value;
}
private Resouce resouceA = new Resouce();
private Resouce resouceB = new Resouce();
public int read(){
synchronized (resouceA) { //Pode haver impasse aqui
synchronized (resouceB) {
return resouceB.value + resouceA.value;
}
}
}
public void wriete(int a, int b){//Pode haver impasse aqui
synchronized (resouceB) {
synchronized (resouceA) {
resouceA.value = a;
resouceB.value = b;
}
}
}
}
Bem na esplicação não compreendi muito o motivo de DeadLock neste algoritimo.
O metodo de leitura tem o bloqueio de resouceA e está acesando a Thread que tem o bloqueio de resouceB
O metodo de gravação tem o bloqueio de resouceB e está acesando a Thread que tem o bloqueio de resouceA
E ambos estão esperando que a liberação um do outro, é isso?
Esplicação simples sobre Threads
3 Respostas
no link abaixo explica algo bastante essencial veja la e altera o titulo para “Explicação sobre Threads”.
Ok. Imagine o seguinte.
A Thread 1 chama o método read, e adquire o lock “resourceA”.
Logo em seguida a Thread 2 entra em ação, chama o método write e adquire o lock “resourceB”.
Tente sair desse impasse.
Se a thread 2 tentar continuar, ela deverá esperar “resourceA”, que está preso com a Thread 1.
Se a thread 1 tentar continuar, ela deverá esperar “resourceB”, que está preso com a Thread 2.
Como um depende da liberação do outro para prosseguir, o sistema está em deadlock.
Eu recomendo a leitura desse artigo (em inglês):
Ficou perfeita a explicação de DeadLock, compreendi o conceito de DeadLock mas não tinha conseguido vizualizar na questão. Devido ao artigo ser em inglês vou tentar ler sim, mas confeso que meu inglês é muito pobre.
