这是我刚才的问题的继任者,Is this variable being safely accessed by using synchronization?“synchronized(this)”与“synchronized((BaseClass)this)”in Java?
对于下面的程序,
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)这个”不等于“这个”)
这个奇怪的模拟代码来自下面的现实生活中的例子,其中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();
}
}
在这个例子中,在SubClassB了“分解()”方法调用其执行锁定到一个“这个”对象,我想是“SuperClassA.this”其超类的“分解()”方法。如果SubClassB的锁定对象“INC()”方法是不完全一样SubClassB的“DEC()”方法锁定的对象,那么我想知道在SubClassB继承反“C”可以不通过不同的线程安全地访问。我觉得在同步块中使用“this”引用有一些含糊之处。
在现实生活中的例子,如果我想SubClassB的反“C”线程安全的,我需要补充一个synchronized块在其“DEC()”方法,这样,
Class SubClassB extends SuperClassA {
public void inc() {
synchronized (this) {
c++;
}
}
public void dec() {
synchronized (this) {
super.dec();
}
}
}
但是看起来这样的增加块不够高雅,可能是多余的!
有没有人对这些问题的一些想法。提前致谢。
劳伦斯
感谢您的回答。 – user1129812 2012-01-05 14:51:34