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