Este es un sucesor de mi pregunta anterior, Is this variable being safely accessed by using synchronization?"synchronized (this)" vs. "synchronized ((BaseClass) this)" en Java?
Para el siguiente programa,
Class SubClassB extends SuperClassA {
protected int c;
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized ((SuperClassA) this) {
c--;
}
}
}
se accedería hilo de seguridad del mostrador "c"? No estoy seguro de que en el método "dec()", ¿el SuperClassA arroja "esta" referencia como un objeto válido para el bloque sincronizado? En caso afirmativo, ¿bloquearían los dos bloques sincronizados el mismo "objeto"? (Como me parece que "(SuperClassA) esto" no es igual a "esto")
Este extraño código simulado proviene del siguiente ejemplo de la vida real donde SuperClassA es una clase base que no debe modificarse,
Class SuperClassA {
protected int c;
public void dec() {
synchronized (this) {
c--;
}
}
}
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
super.dec();
}
}
en este ejemplo, el método de "DEC()" en SubClassB llamadas a métodos de su superclase "DEC()" que lleva a cabo un bloqueo para un objeto "this" que supongo que ser "SuperClassA.this". Si el objeto bloqueado en el método "inc()" de SubClassB no es exactamente el mismo que el objeto bloqueado en el método "dec()" de SubClassB, entonces me pregunto si el subtema heredado "c" en SubClassB NO puede ser accedido de forma segura por diferentes subprocesos . Siento que hay algunas ambigüedades al usar la referencia "this" en bloques sincronizados.
En el ejemplo de la vida real, si quiero contador "c" de SubClassB ser seguro para subprocesos, necesito para añadir una cuadra más sincronizada en su método "DEC()", de esta manera,
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized (this) {
super.dec();
}
}
}
¡Pero parece que ese bloque agregado no es elegante y puede ser redundante!
¿Alguien tiene algunas ideas sobre estas preguntas? Gracias por adelantado.
Lawrence
Gracias por sus respuestas. – user1129812