Muchas gracias a los dos por la ayuda, pero creo que ninguna de las soluciones me sirve.
Solucion propuesta 1: sincronizar
La solucion de iterar dentro de un bloque sincronizado serviria si pudiese modificar la clase conjunto para que todos los metodos fuesen sincronizados; de nada me sirve adquirir el lock sobre conjunto si luego los otros hilos no van a esperar por el. Me explico:
------> En el primer hilo://adquiero el lock sobre conjunto sinchronized(conjunto){
it = conjunto.iterador();
if (it.hayMas) { ------> El primer hilo se suspende, se activa el segundo hilo conjunto.operacionEspecial();
Y ya estamos en la misma situacion. Para que funcionase, tendria que modificar operacionEspecial() para que fuese synchronized, que no puedo, o modificar el codigo que la invoca para que esperara por el lock sobre conjunto:
Lamentablemente, tampoco tengo permisos para modificar todos los sitios en los que se llama a operacionEspecial():-( Esto no lo habia dicho en la bitacora, sin esta restriccion la solucion propuesta por lasiozillo sería válida.
Solucion propuesta 2: usar un proxy y sincronizar sobre el proxy.
Tiene el mismo problema que la anterior, no basta con que mi codigo use el proxy, todas las clases que invocan a Conjunto tendrian que ser modificadas para usar el proxy:-(
A esta solucion le pasa lo mismo que a la anterior, es correcta para el problema según lo planteo en la bitácora pero no me sirve porque en el Mundo Real(tm) tengo más restricciones de las que expuse.
--
En España la mejor manera de guardar un secreto es escribir un libro.
Respondiendo a los dos
(Puntos:2)( http://mcpolu.blogspot.com/ | Última bitácora: Miércoles, 05 Marzo de 2014, 00:04h )
Solucion propuesta 1: sincronizar
La solucion de iterar dentro de un bloque sincronizado serviria si pudiese modificar la clase conjunto para que todos los metodos fuesen sincronizados; de nada me sirve adquirir el lock sobre conjunto si luego los otros hilos no van a esperar por el. Me explico:
------> En el primer hilo:
sinchronized(conjunto){
it = conjunto.iterador();
if (it.hayMas) {
------> El primer hilo se suspende, se activa el segundo hilo
conjunto.operacionEspecial();
Y ya estamos en la misma situacion. Para que funcionase, tendria que modificar operacionEspecial() para que fuese synchronized, que no puedo, o modificar el codigo que la invoca para que esperara por el lock sobre conjunto:
sinchronized(conjunto){
conjunto.operacionEspecial();
}
Lamentablemente, tampoco tengo permisos para modificar todos los sitios en los que se llama a operacionEspecial()
Esto no lo habia dicho en la bitacora, sin esta restriccion la solucion propuesta por lasiozillo sería válida.
Solucion propuesta 2: usar un proxy y sincronizar sobre el proxy.
Tiene el mismo problema que la anterior, no basta con que mi codigo use el proxy, todas las clases que invocan a Conjunto tendrian que ser modificadas para usar el proxy
A esta solucion le pasa lo mismo que a la anterior, es correcta para el problema según lo planteo en la bitácora pero no me sirve porque en el Mundo Real(tm) tengo más restricciones de las que expuse.
En España la mejor manera de guardar un secreto es escribir un libro.