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

标签 java multithreading variables initialization

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

相关文章:

Java:数组类型的javadocs

java - 哪些情况会导致间歇性 JAXBException?

java - Java 中的多线程

c++ - 如何使用函数 : C++ 创建线程

android postDelayed 和 removeCallbacksAndMessages 同步

Bash:将变量传递给 mv 命令选项

java - Eclipse 调试收集变量值

java - 清理未关闭的 ZipFile 以在 excel 文件中归档

java - 如何在不删除格式设置的情况下将 Html 转换为字符串?

JavaScript 变量数学