Это преемник моего предыдущего вопроса, Доступна ли эта переменная с помощью синхронизации?
Для следующей программы
Class SubClassB extends SuperClassA {
protected int c;
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized ( (SuperClassA) this) {
c--;
}
}
}
Будет ли доступ к счетчику "c" безопасным потоком? Я не уверен, что в методе "dec()" ли ссылка SuperClassA "this" ссылается на действительный объект для синхронизированного блока? Если да, будут ли два синхронизированных блока блокировать один и тот же объект "this"? (Как мне кажется, "(SuperClassA) это" не равно "this")
Этот странный симулированный код исходит из следующего примера реальной жизни, где SuperClassA - это базовый класс, который не должен быть изменен,
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();
}
}
В этом примере метод "dec()" в SubClassB вызывает свой метод "dec()" суперкласса, который выполняет блокировку объекта "this", который, я полагаю, является "SuperClassA.this". Если заблокированный объект в методе SubClassB "inc()" не совсем то же самое, что и заблокированный объект в методе "dec()" в SubClassB, то мне интересно, унаследованный счетчик "c" в SubClassB НЕ может быть безопасным образом доступ к различным потокам, Я чувствую, что есть некоторые двусмысленности в использовании ссылки "this" в синхронизированных блоках.
В примере реальной жизни, если я хочу, чтобы счетчик "c" SubClassB был потокобезопасным, мне нужно добавить еще один синхронизированный блок в свой метод "dec()" , например,
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized (this) {
super.dec();
}
}
}
Но кажется, что такой добавленный блок не изящный и может быть лишним!
Есть ли у кого-нибудь идеи по этим вопросам. Спасибо заранее.
Лоуренс