从外部获取线程变量的值

Bie*_*aja 6 java multithreading

可以说我有一个像这样运行的线程:

private boolean working = true;

@Override public void run() {
   working = true;
   // do something
   working = false;
   ....
}
Run Code Online (Sandbox Code Playgroud)

在我的主线程中,我不断推出与之合作的状态

while(threadClassObject.isWorking()) {
    System.out.println(threadClassObject.isWorking());
}
Run Code Online (Sandbox Code Playgroud)

这会有用吗?我试过这个例子,它似乎工作.但有没有办法可以崩溃?如果线程正在改变工作的过程中,例如在mainThread尝试读取它的同时发生了什么?

hav*_*exz 6

您的问题的答案是它可能正在工作,但上面的代码是一个有风险的代码,可以在任何一天打破.尝试做working volatile

private volatile boolean working = true;
Run Code Online (Sandbox Code Playgroud)

What e.g. happens if the thread is in the process of changing working while at the exact same time the mainThread tries to read it?

赋值操作是原子操作.因此,如果您有单个cpu,则两个线程在访问变量时永远不会发生冲突.如果您有多个cpu,则两个线程在访问变量时可能会发生冲突.对于这两种情况,volatile将确保该值对其他线程可见.

注意:volatile在您的情况下很好,但如果您有更复杂的数据要跨线程共享,请尝试查看此内容

编辑:

添加评论也是soln的一部分.使它更清楚.

基本上在cpu级别优化的bcoz,值改变了我的一个线程可能对另一个线程不可见.一个很好的例子是cpu cache bcoz optimization,这些值永远不会反映在另一个线程可能正在读取的ram中.Volatile告诉我这个变量的值可以在当前线程的范围之外更改,所以不进行这样的优化......