多线程实例字段实现

时间:2015-05-08 07:03:04

标签: java multithreading scjp ocpjp

public class Chicks {
    synchronized void yacks(long id)
    {
        for(int x = 1; x<3; x++)
        {
            System.out.println(id + " ");
            Thread.yield();
        }
    }
}
class ChickYacks implements Runnable
{
    Chicks c; // No exception if I declare it as static
    public static void main(String[] args) {
        new ChickYacks().go();
    }
    public void run()
    {
        c.yacks(Thread.currentThread().getId()); //Throws a Nullpointer exceptin
    }
    void go()
    {
        c = new Chicks();
        new Thread(new ChickYacks()).start();
        new Thread(new ChickYacks()).start();
    }
}

为什么它会在run method()中抛出Nullpointer异常。一切看起来都很好。当我宣布Chicks 'c'为静态但我不理解为什么?

1 个答案:

答案 0 :(得分:6)

您的go方法为{this} ChickYacks的“此”实例分配了非空值,但随后创建了两个 ChickYacks实例,每个对于c,它将具有空值。

你可以:

  • 在构造函数中初始化c,以便每个实例都具有非空值
  • 在字段初始值设定项中初始化c
  • c方法
  • 中初始化run()
  • c方法
  • 中为实例初始化go
  • this传递给Thread构造函数,而不是创建新实例
  • 使c静态,以便从哪个实例访问它无关紧要(或者实际上是否以静态方法访问它;它将与类型而不是实例相关联)

这与线程无关,真的。如果你没有使用线程,你会得到同样的效果,只是在原始线程中抛出异常而不是新线程:

void go()
{
    c = new Chicks();
    new ChickYacks().run(); // Bang!
    new ChickYacks().run();
}