我打算测试多线程情况下一个long数值在++的时候是否会有多线程问题,代码如下(jdk版本1.7.0_07):
public class A { private long value = 0; public long getValue() { return value; } public void add1() { this.value++; } } public class Test implements Runnable { private static final long TIME = 50; private A a; private long count = 0; private boolean over = false; public boolean isOver() { return this.over; } public void setOver(boolean over) { this.over = over; } @Override public void run() { long time = System.currentTimeMillis(); do { count++; a.add1(); } while ((System.currentTimeMillis() - time) < TIME); this.setOver(true); System.out.println("over " + a.getValue() + " , count = " + count); } public static void main(String args[]) { A a = new A(); Test t1 = new Test(); Test t2 = new Test(); t1.a = a; t2.a = a; new Thread(t1).start(); new Thread(t2).start(); for (; ; ) {//死循环 if (t1.isOver() && t2.isOver()) {//当t1和t2都执行完毕的时候打印并退出 System.out.println(t1.count); System.out.println(t2.count); System.out.println(a.getValue()); System.out.println(a.getValue() == (t1.count + t2.count)); break; } } } }
在运行代码时发现程序无法正常退出,(run函数可以正常执行完毕,但是主线程无法退出,)
我已开始人为我over没有做好,但是检查之后发现Over没有问题,所以我在isOver函数中添加了一行System.out.println(over);
再次测试的时候发现程序可以正常执行完并退出.
我又将System.out.println(over);注释掉后 发现程序又死在那里,
这引起了我的思考,我以为是我ide的问题,接着直接在字符界面使用java命令发现也是这个问题,
然后又换到linux系统下 发现还是如此(linux系统下 jdk1.7.0_40),
哪位知道这个问题的主要原因?求指导.
守候你守候我
慕慕森
慕妹3146593
相关分类