Olá!
Estava desenvolvendo alguns estudos envolvendo Threads e Singletons e cheguei a um problema que não consegui entender.
Criei um Singleton que implementa a interface Runnable. O meu Singleton tem um atributo privado que armazena seu estado de execução (running). Quando executo meu programa, por meio de uma Thread, o status é alterado. Até aqui, tudo certo.
O meu problema está quando faço uma segunda execução em paralelo. O estado não é armazenado e a exceção (IllegalStateException) não é lançada.
Já tentei tornar o atributo running estático, mas não resolveu. Acredito que seja falta de entendimento ou visualização de algum conceito que esteja me impedindo de pensar em uma solução. Vocês conseguem ver alguma possibilidade?
Para simular o problema, compile e execute o código abaixo (reserve, rs) e execute novamente, em paralelo, o programa. As duas execuções ficaram esperando algo da entrada padrão. Sendo que o esperado é que a segunda execução lance uma exceção.
import java.util.Scanner;
public class Singleton implements Runnable {
private static final Singleton singleton = new Singleton();
private boolean running;
public static void main(String[] args) {
new Thread(Singleton.getInstance(), "SigletonThread").start();
}
public void run() {
/*
* Se uma thread baseada nessa classe já estiver rodando, lança uma
* exceção.
*/
if (running) {
throw new IllegalStateException("A thread já está rodando.");
}
running = true;
/*
* Isso serve apenas para "segurar" a execução.
*/
Scanner s = new Scanner(System.in);
String c = null;
while (!"exit".equals(c)) {
c = s.nextLine();
}
System.exit(0);
}
public static Singleton getInstance() {
return singleton;
}
private Singleton() {}
}
Obrigado!