У меня есть случай, когда у класса 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.
}
Метод getOutBmpB () в классе B выполняется потоком, а унаследованный метод run () в ClassB - другим потоком. Метод «createBitmap ()», реализованный в ClassB, должен запускаться в синхронизированном блоке внутри метода «run ()».
Мой вопрос заключается в том, что я не уверен, что эти две нити безопасно доступны для новой определенной переменной класса "outBmpB" в ClassB. Я не уверен, что блок «synchronized (this)» в методе «run ()» также «заблокирует» переменную «outBmpB», определенную только в ClassB? Если нет, то я мог бы добавить блок «synchronized (this)» в реализации «createBitmap ()». например,
protected Bitmap createBitmap() {
synchronized (this) {
outBmpB = ..... // create and process "outBmpB".
}
Bitmap bmp;
bmp = ..... // create and process "bmp".
return bmp;
}
Спасибо за любые предложения.
Lawrence