【发布时间】:2015-04-27 12:17:56
【问题描述】:
请向我解释变量的奇怪行为。 从主线程创建类“B”的实例。 父“A”的构造函数被称为“B”类的抽象函数“init”。 它初始化“B”类的 debugPaint 成员。
然后,它创建一个线程,定期调用函数postDraw。 问题是,如果我指定 private volatile Paint debugPaint=null 函数 postDraw 接收 debugPaint 成员作为 null。尽管正如我在调试器中看到的,之前的初始化是成功的。 如果未完成对 null 的分配,则一切正常。 private volatile Paint debugPaint; 有什么问题?
p.s init 和 postDraw 之间的时间很长,只有几秒钟。
public class A{
public A()
{
init();
}
public void draw(Canvas canvas)
{
//some code....
postDraw(canvas);
}
abstract public void postDraw(Canvas canvas);
abstract public void init();
}
public class B extends A{
private volatile Paint debugPaint=null;//=null problem! not =null ok!
@Override
public void init()
{
debugPaint=new Paint();
}
@Override
public void postDraw(Canvas canvas)
{
canvas.drawRect(0,0,128,128,debugPaint);
}
}
【问题讨论】:
-
请发布一个简短但完整的程序来演示该问题。我们这里只有部分代码。 (另外,请遵循示例代码中的 Java 命名约定,以避免认知失调。)
-
赞成“认知失调”一词
-
为什么不使用字段初始化,即
private final Paint debugPaint = new Paint();?顺便说一句:构造函数永远不应该调用抽象或可覆盖的方法! (见stackoverflow.com/questions/15327417/…) -
@isnot2bad 例如,我已经简化了。其实debugPaint的初始化过程比较复杂。
标签: java multithreading variables initialization