gpt4 book ai didi

java - 从另一个线程调用时变量为空

转载 作者:行者123 更新时间:2023-11-29 03:12:16 26 4
gpt4 key购买 nike

请向我解释变量的奇怪行为。从主线程创建类“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);
}
}

最佳答案

您的问题与线程无关。

下面的示例是演示问题的完整程序:

main() 例程创建一个新的 B 实例时,它首先调用 A() 构造函数。该构造函数调用 B.init() 将 debugPaint 设置为指向新的 Paint 对象。然后,在 A() 构造函数完成后,默认 B() 构造函数被调用...

class Paint {
}

class Canvas {
}

abstract class A{

public A()
{
System.out.println("A.<init>() entered");
init();
System.out.println("A.<init>() exit");
}

public void draw(Canvas canvas)
{
//some code....
postDraw(canvas);
}

abstract public void postDraw(Canvas canvas);
abstract public void init();
}


class B extends A{

private volatile Paint debugPaint=null; //this assignment happens in the default B() constructor

@Override
public void init()
{
System.out.println("B.init() entered");
debugPaint=new Paint();
System.out.println("B.init() exit");
}


@Override
public void postDraw(Canvas canvas)
{
System.out.println("debugPaint=" + debugPaint);
}
}

public class Foobar {
public static void main(String[] args) {
B b = new B();
b.draw(new Canvas());
}
}

关于java - 从另一个线程调用时变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28720131/

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