Java Thread join()行为

时间:2016-12-03 17:22:10

标签: java multithreading join

public class RunTest {
    public static int counter = 0;
    static class RunnerDec implements Runnable{
        public void run(){
            for(int i=0;i<5000; i++){
                counter--;
            }
        }
    }

    static class RunnerInc implements Runnable{
        public void run(){
            for(int i=0;i<5000; i++){
                counter++;
            }
        }
    }

    public static void main(String[] args) {
        RunnerDec rd = new RunnerDec();
        RunnerInc ri = new RunnerInc();
        Thread t1 = new Thread(rd);
        Thread t2 = new Thread(ri);
        t1.start();     
        t2.start();
        try{
            t1.join(); // this will stop the main thread until t1 is done incrementing 5000 times
            t2.join(); // this will stop the main thread until t2 is done incrementing 5000 times
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(counter);
    }

}
  

我希望每次唉不是这样的结果为0。 java doc说join()“等待这个线程死”。我觉得主线程应该等待t1完成然后等待t2完成。那不是正在发生的事情。谢谢你的清晰度!!

1 个答案:

答案 0 :(得分:2)

确实等待线程死亡。但是你的两个线程在没有任何同步的情况下同时更新共享变量,因此你会看到竞争条件和可见性问题。

例如:

counter = 1000
thread 1 reads counter : 1000
thread 2 reads counter : 1000
thread 1 increments and writes counter: 1001
thread 2 decrements and writes counter: 999

由于++和 - 不是原子操作,上面的线程隔行扫描示例会失去一个增量。

解决这些问题最简单的方法是使用AtomicInteger而不是int。要理解问题的关键,您最好先阅读Java Concurrency in Practice,或者至少阅读Java并发教程。