Boa tarde galera,
Estou com um pequeno problema. Preciso implementar, com finalidade acadêmica, um semáforo binário em java sem o uso da classe semaphore. É possível faze-lo sem uso de monitores?
segue um código
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class BinarySemaphore {
AtomicInteger value; //variável atômica
ConcurrentLinkedQueue queue; // Fila FIFO
public BinarySemaphore() {
value = new AtomicInteger(1);
queue = new ConcurrentLinkedQueue();
}
//Operação para verificar/solicitar o semáforo
public void P(){
//se o valor for zero, entra na fila de bloqueio
//se o valor for 1 troca o valor para zero e não coloca na fila
if (!value.compareAndSet(1,0)) block();
}
//Operação liberar/incrementar o semáforo
public void V(){
//se fila não vazia, libera alguem da fila
if(!queue.isEmpty()) unblock();
else value.set(1);
}
private void block() {
//captura referencia ao thread atual
Thread t = Thread.currentThread();
//adiciona na fila de processos
queue.add(t);
t.suspend();
}
private void unblock(){
//Recupera e remove a cabeça desta fila , ou retorna null se essa fila está vazia .
Thread t = (Thread) queue.poll();
//se fila nao vazia, libera um processo
if (t!=null) t.resume();
}
}
O código acima funciona, porém possui métodos depreciados (suspend, resume). Gostaria de saber como faço para alterar esses métodos sem alterar a funcionalidade do Semáforo Binário, ou se existe uma melhor alternativa para o meu problema.