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完成。那不是正在发生的事情。谢谢你的清晰度!!
答案 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并发教程。