Questo è un successore della mia domanda precedente, Is this variable being safely accessed by using synchronization?"sincronizzato (questo)" contro "sincronizzato ((BaseClass) questo" in Java?
Per il seguente programma,
Class SubClassB extends SuperClassA {
protected int c;
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized ((SuperClassA) this) {
c--;
}
}
}
sarebbe il contatore "c" è accessibile thread-safe? Non sono sicuro che nel metodo "dec()", la cast di SuperClassA "this" faccia riferimento a un oggetto valido per il blocco sincronizzato? Se sì, i due blocchi sincronizzati bloccerebbero lo stesso oggetto "questo"? (Come mi sembra che "(SuperClassA) questo" non è uguale a "questo")
Questo strano codice simulato deriva dal seguente esempio di vita reale in cui SuperClassA è una classe base che non dovrebbe essere modificata,
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();
}
}
in questo esempio, il metodo "DEC()" in SubClassB chiama metodo sua superclasse "DEC()" che esegue una serratura per un "questo" oggetto che supponiamo essere "SuperClassA.this". Se l'oggetto bloccato nel metodo "inc()" di SubClassB non è esattamente uguale all'oggetto bloccato nel metodo "dec()" di SubClassB, allora mi chiedo se il contatore ereditato "c" in SubClassB NON possa essere acceduto in modo sicuro da thread diversi . Sento che ci sono alcune ambiguità nell'usare il riferimento "questo" nei blocchi sincronizzati.
Nell'esempio vita reale, se voglio contatore "c" di SubClassB essere thread-safe, ho bisogno di aggiungere un blocco più sincronizzato nel suo metodo "DEC()", in questo modo,
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized (this) {
super.dec();
}
}
}
Ma sembra che tale blocco aggiunto non sia elegante e potrebbe essere ridondante!
Qualcuno ha qualche idea su queste domande. Grazie in anticipo.
Lawrence
Grazie per le vostre risposte. – user1129812