Duvida com Thread e Semaphores

4 respostas
N

Olás,

bem estou tendo um problemas para implementar o problema dos leitores e escritores em Java,
e minha dúvida é a seguinte:

Esta é a raiz do problema o método filaDeEspera ele está dando erro no wait:

Exception in thread Thread-1 java.lang.IllegalMonitorStateException

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at BaseDeDados.filaDeEspera(BaseDeDados.java:110)

at Escritor.run(Escritor.java:52)

E eu não estou entendendo porque.
Basicamente eu mando ele esperar nada de mais.

public class BaseDeDados{
        private Semaphore controleDeLeitores;
	public int numeroDeLeitores;
	private Semaphore baseDeDados;
	private int entidadeEsperando;
	private Semaphore controleDeEntidadeEsperando;

public void filaDeEspera(String str){
		this.adquireCDEE();
		/*
		if(this.getEntidadeEsperando() == SIM){
			System.out.println(str);
			while(this.getEntidadeEsperando() == SIM){
				try {
					this.liberaCDEE();
					Leitor.sleep(200);
					this.adquireCDEE();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}*/

		if(this.getEntidadeEsperando() == SIM)
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		this.liberaCDEE();
	}
}

A parte comentada funciona porém se algum leitor ou escritor chegar enquanto os que já
estavam na ficam dormindo já era a prioridade.

Desde já grato.

4 Respostas

ViniGodoy

O wait precisa estar num bloco synchronized.

N

Não necessariamente que eu saiba para usar wait eu preciso ter o Lock do objeto que nesse caso eu tenho (eu acho),
e eu não posso usar syncronized.

ViniGodoy

n4b0:
Não necessariamente que eu saiba para usar wait eu preciso ter o Lock do objeto que nesse caso eu tenho (eu acho),
e eu não posso usar syncronized.

Você adquire o lock do objeto usando um bloco synchronized.
O erro IllegalMonitorStateException indica que você não tem o lock.

Provavelmente você terá que chamar métodos da classe Semaphore. Além disso, você não deveria fazer o wait() fora de um while, ou você pode cair no problema de spurious wakeup.

N

Sim adquireCDEE() chama o método acquire encima do semáforo controleDeEntidadeEsperando, assim adquirindo o lock do objeto não?

Criado 4 de abril de 2011
Ultima resposta 4 de abr. de 2011
Respostas 4
Participantes 2