Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación, y ofrecer contenidos y publicidad de interés.
Al continuar con la navegación entendemos que se acepta nuestra política de cookies.
Iniciar sesión Cerrar
Correo:
Contraseña:
Entrar
Recordar sesión en este navegador
Iniciar sesiónIniciar sesiónCrear cuentaCrear cuenta

Java - Métodos synchronized

Vista:
Me gusta: Está pregunta es útil y esta clara
0
No me gusta: Está pregunta no esta clara o no es útil
 
Asunto:

Métodos synchronized

Autor:Aitor (13 intervenciones)
Fecha:09/11/2009 17:23:35
Hola,

vereis, tengo 3 clientes servidores que acceden a una seccion critica a la que solo peude acceder uno y para ello cada uno que quiere acceder pregunta a los demas si estan en ella (esto por RMI) , por tanto, en una parte del extenso codigo se trata de que espere en un wait() hasta que el otro cliente-servidor le envie un ok.

la cuestion es que declaro un metodo synchronized pq va a contener un wait dentro de el:

public synchronized void requestAccess(Client requesterClient)

....

while (votes<=listaServers.length){
try {
System.out.println("esperando en el wait ???");
wait();
System.out.println("ya no esperamos");
} catch (InterruptedException e) {e.printStackTrace();}

y en el metodo de envio de OK

declaro lo siguiente:

public synchronized void OK() {

votes++;
System.out.println("sumando votos");
notifyAll();

}

El problema, es que segun se desarrolla el programa principal, desde requestAccess accede a otro metodo, y desde este otro metodo al metodo OK(), es decir, que llega antes al notifyAll que al wait. Pero bueno, el mayor problema es que nunca llega a entrar al metodo OK, y yo deduzco que es porque es synchronized y tengo algun error de concepto.. y no se pueden declarar 2 metodos synchronized en la misma clase, o no se puede llamar desde un synchronized a otro... o que. No tengo mucha idea de threads la verdad y por mas que leo no entiendo que hago mal.

Lo que quiero es que cada vez que se llegue a la parte del codigo OK se notifique al thread que esta en wait() para que siga con la ejecucion.

No se si me he explicado bien...

Un saludo y gracias.
Responder
información
Otras secciones de LWP con contenido similar...
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:Métodos synchronized

Autor:Tom (520 intervenciones)
Fecha:10/11/2009 09:29:01
No sé si te explicas bien, pero al menos yo no he conseguido entenderte (lo que sí he conseguido es dolor de cabeza) :-D

Echa un ojo a esta página, está bastante bien:

http://www.chuidiang.com/java/hilos/wait_y_notify.php
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:Métodos synchronized

Autor:paco (7 intervenciones)
Fecha:10/11/2009 15:58:31
mandeeeee?,... XD eso es una consulta rara y lo demas tonterias
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:Métodos synchronized

Autor:Aitor (13 intervenciones)
Fecha:10/11/2009 20:40:28
si, es un movidon y dificl de explicar asi desde 0.

jeje,

bueno, voy a intentar explicarme mejor, o enfocar la pregunta algo mas general.

A ver, tengo 2 metodos en una clase.

Desde uno hago un wait(), por tanto debe ser synchronized, no ?

y desde el otro metodo quiero hacer un notifyAll(), tambien debe ser synchronized, no ?

Bueno, seria tal que asi.

// MAIN

metodoConWait()

// FIN MAIN

// Metodos de la clase


public synchronized void metodoConWait(){

....

/*llamada*/ metodoConNotifyAll(); //aqui dentro se hara el notifyAll
....

wait()

...

}

//---------------------------------------------------------------------------

public synchronized void metodoConNotifyAll(){

...

notifyAll();

....

}



pero el problema, es que cuando ejecuto el metodo, "metodoConWait()" se me queda parado en la llamada MetodoConNotifyAll() y no llega a entrar al metodo, y no entiendo por que, si le quito el synchronized al metodoConNotifyAll() entonces si me entra, pero claro, no me deja hacer el notifyAll().

La cosa es bastante mas compleja que todo esto, y tiene sentido que primero se haga el notifyAll, al menos en una primera vez (o eso creo, si es imposible, o asi decidmelo...), pero si me resolveis esto doy un paso adelante.

Si seguis sin entender mi pregunta, lo volveré a intentar explicar, pq como veis no he dado con la solucion :S

un saludo y gracias.
Comentar