gpt4 book ai didi

java - "synchronized(this)"与 Java 中的 "synchronized((BaseClass)this)"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:18 28 4
gpt4 key购买 nike

这是我之前问题的后续问题,Is this variable being safely accessed by using synchronization?

对于下面的程序,

Class SubClassB extends SuperClassA {
protected int c;

public void inc() {
synchronized (this) {
c++;
}
}

public void dec() {
synchronized ( (SuperClassA) this) {
c--;
}
}
}

计数器“c”会被线程安全地访问吗?我不确定在“dec()”方法中,SuperClassA 强制转换“this”是否引用了同步块(synchronized block)的有效对象?如果是,两个同步块(synchronized block)是否会锁定同一个“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 中的“dec()”方法调用其父类(super class)的“dec()”方法,该方法对我认为是“SuperClassA.this”的“this”对象执行锁定。如果 SubClassB 的“inc()”方法中的锁定对象与 SubClassB 的“dec()”方法中的锁定对象不完全相同,那么我想知道 SubClassB 中继承的计数器“c”可能无法被不同的线程安全访问.我觉得在同步块(synchronized block)中使用“this”引用有一些歧义。

在现实生活中,如果我希望 SubClassB 的计数器“c”是线程安全的,我是否需要在它的“dec()”方法中添加一个同步块(synchronized block),像这样,

Class SubClassB extends SuperClassA {

public void inc() {
synchronized (this) {
c++;
}
}

public void dec() {
synchronized (this) {
super.dec();
}
}
}

但这样添加的 block 似乎并不优雅,可能是多余的!

有没有人对这些问题有一些想法。提前致谢。

劳伦斯

最佳答案

代码是线程安全的,因为 (SomeObject) thisthis 是同一个对象。强制转换不会将一个对象转换为另一个对象。

但是,代码缺少封装,因为它允许任何子类以非同步方式访问 protected c 字段。因此,任何子类都可以使用 c++c-- 而无需任何同步。该字段应该是私有(private)的。

关于java - "synchronized(this)"与 Java 中的 "synchronized((BaseClass)this)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com