多线程实例字段实现

Multi threading instance field implementation

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()中抛出空指针异常。我觉得一切都很好。当我将 Chicks 'c' 声明为静态但我不明白为什么?

您的 go 方法将非空值分配给 ChickYacks 的 "this" 实例 - 但随后创建了两个 new 实例 ChickYacks,每个 c.

都有一个空值

你可以:

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

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

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