Hice un objeto Stack sincronizado simple en Java, solo para fines de capacitación. Esto es lo que hice:¿Cómo crear correctamente una clase SynchronizedStack?
public class SynchronizedStack {
private ArrayDeque<Integer> stack;
public SynchronizedStack(){
this.stack = new ArrayDeque<Integer>();
}
public synchronized Integer pop(){
return this.stack.pop();
}
public synchronized int forcePop(){
while(isEmpty()){
System.out.println(" Stack is empty");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return this.stack.pop();
}
public synchronized void push(int i){
this.stack.push(i);
notifyAll();
}
public boolean isEmpty(){
return this.stack.isEmpty();
}
public synchronized void pushAll(int[] d){
for(int i = 0; i < d.length; i++){
this.stack.push(i);
}
notifyAll();
}
public synchronized String toString(){
String s = "[";
Iterator<Integer> it = this.stack.iterator();
while(it.hasNext()){
s += it.next() + ", ";
}
s += "]";
return s;
}
}
Aquí están mis preguntas:
¿Está bien que no sincronice el método
isEmtpy()
? Pensé que era porque incluso si otro hilo está modificando la pila al mismo tiempo, aún así devolvería un resultado coherente (no hay ninguna operación que entre en un estado isEmpty que no sea ni inicial ni final). ¿O es un mejor diseño tener sincronizados todos los métodos de un objeto sincronizado?No me gusta el método
forcePop()
. Solo quería crear un hilo que pudiera esperar hasta que se insertara un elemento en la pila antes de mostrar un elemento, y pensé que la mejor opción era hacer el ciclo con elwait()
en el métodorun()
del hilo, pero puedo 't porque arroja unIllegalMonitorStatException
. ¿Cuál es el método adecuado para hacer algo como esto?¿Algún otro comentario/sugerencia?
¡Gracias!
No bloquee los métodos, prefiera bloquear los objetos. Lea esto: http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html –
Stack extends Vector, que ya está sincronizado. Una elección diferente de la colección podría ser mejor para este ejercicio de entrenamiento. –
Don Roby: Sí, como lo señala axtavt, ahora estoy usando ArrayDeque. – nbarraille