【发布时间】:2012-01-04 13:17:01
【问题描述】:
我有一个案例,其中 Java 类有一个包含同步块的超类。
Class SuperClassA {
private Bitmap bmpA;
protected abstract Bitmap createBitmap();
public void run() {
synchronized (this) {
bmpA = createBitmap();
}
}
// some other codes.
}
Class SubClassB extends SuperClassA {
private Bitmap outBmpB;
protected Bitmap createBitmap() {
outBmpB = ..... // create and process "outBmpB".
Bitmap bmp;
bmp = ..... // create and process "bmp".
return bmp;
}
public Bitmap getOutBmpB() {
Bitmap tempBmp;
synchronized (this) {
tempBmp = outBmpB.clone();
}
return tempBmp;
}
// some other codes.
}
Class B 中的“getOutBmpB()”方法由一个线程运行,而 ClassB 中继承的“run()”方法由另一个线程运行。 ClassB 中实现的“createBitmap()”方法应该在“run()”方法内的同步块中运行。
我的问题是我不确定ClassB中新定义的类变量“outBmpB”是否被两个线程安全访问。我不确定“run()”方法中的“同步(this)”块是否也会“锁定”仅在 ClassB 中定义的“outBmpB”变量?如果没有,那么我可以在“createBitmap()”实现中添加一个“同步(this)”块。例如
protected Bitmap createBitmap() {
synchronized (this) {
outBmpB = ..... // create and process "outBmpB".
}
Bitmap bmp;
bmp = ..... // create and process "bmp".
return bmp;
}
感谢您的任何建议。
劳伦斯
【问题讨论】:
-
createBitmapA()和createBitmap()是不是同一个方法,有错别字? -
那个代码很难理解。由于分配给 outBmpB,同步完成。嵌套同步没问题。您覆盖 createBitmap 的事实,并且在一个版本中不同步可能存在样式问题,但看起来它可能会起作用。
-
@JoopEggen 那么他是否会覆盖
createBitmap()? :) -
@alf:(首先抽象声明有一个错字:createBitmapA。)答案是:可以写在子类
@Overriden中,所以它被覆盖了。
标签: java nested synchronized