用线程做简单的练习

时间:2014-03-02 15:50:38

标签: java multithreading

我第一次用线程练习,但我无法实现目标。我需要像这样打印一个循环

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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您在线程之间共享内存,则需要考虑一些事项。 Java内存模型详细指定了行为。幸运的是,有一个非常简单的规则,它解决了共享内存的大多数问题(JLS 17.4.5):

  

[..]如果所有顺序一致的执行都没有数据争用,[..]那么程序的所有执行都将显示为顺序一致。

换句话说:避免数据竞赛。如果没有数据竞争,那么内存操作将完成大多数开发人员的期望。

存在数据竞争,如果两个线程可能同时访问内存位置,则至少一个访问是写操作,并且内存位置不是 volatile < / em>的。在您的示例中,var上存在数据竞争。通过将var声明为volatile,您可以删除数据竞赛,并且该程序可以正常运行。