我第一次用线程练习,但我无法实现目标。我需要像这样打印一个循环
A
B
A
B
A...
我使用两个线程,一个用于打印A而另一个用于B.为更改A和B添加静态变量。
结果是:
A
B
有时候:
A
B
A
有什么问题?我做坏事,但我不知道。
public class ExecucioThreads {
public static boolean var;
public static void main(String[] args) {
new MeuThread_A().start();
new MeuThread_B().start();
}
}
public class MeuThread_A extends Thread {
@Override
public void run() {
while (true) {
if (ExecucioThreads.var) {
System.out.println("A");
ExecucioThreads.var = false;
}
}
}
}
public class MeuThread_B extends Thread {
@Override
public void run() {
while (true) {
if (ExecucioThreads.var == false) {
System.out.println("B");
ExecucioThreads.var = true;
}
}
}
}
答案 0 :(得分:0)
如果您在线程之间共享内存,则需要考虑一些事项。 Java内存模型详细指定了行为。幸运的是,有一个非常简单的规则,它解决了共享内存的大多数问题(JLS 17.4.5):
[..]如果所有顺序一致的执行都没有数据争用,[..]那么程序的所有执行都将显示为顺序一致。
换句话说:避免数据竞赛。如果没有数据竞争,那么内存操作将完成大多数开发人员的期望。
存在数据竞争,如果两个线程可能同时访问内存位置,则至少一个访问是写操作,并且内存位置不是 volatile < / em>的。在您的示例中,var
上存在数据竞争。通过将var
声明为volatile
,您可以删除数据竞赛,并且该程序可以正常运行。