解决方案 »

  1.   

    这个应该是多线程访问操作同一个资源test.getModel().a,涉及到线程同步问题
      

  2.   

    java中的++操作不是线程安全的,你要加同步机制。
    简单一点的就把
    int a=0---》改成:AtomicInteger a = new AtomicInteger(0);
    a.getAndIncrement();//以原子方式将当前值加 1,返回当前值
     
      

  3.   

    添加同步互斥看看。
    你的hashCode为什么没打印出来啊?
      

  4.   

     这主要是线程同步的问题 , 考虑synchronized 关键字 的运用吧 
      

  5.   

    hashCode为什么没打印出来啊? 
      

  6.   

    额,添加互斥肯定就没有问题了,我主要是好奇为什么同样有出现未同步的问题,但是两种情况的结果会有这么大的差别。至于hashCode不好意思,我传代码的时候做了点修改,把hashcode去掉了,这里是没有问题的~
      

  7.   

    1.我试了下,设成1秒问题依然在
    2.请问你觉得是时钟的问题,能不能帮忙解释下具体是怎么从时钟不精确导致结果差异的。谢谢~Thread.sleep()的文档上有注释的,你可以看看。
    写个例子,你运行一下看看你电脑的时钟精度,反正我每次都不会正好50的public static void main(String[] args) throws InterruptedException {
    int count = 0;
    while(count ++ < 30){
    long start = System.nanoTime();
    Thread.sleep(50);
    long end = System.nanoTime();
    System.out.println((end-start) / 1000000.0);
    }
    }
      

  8.   

    1.我试了下,设成1秒问题依然在
    2.请问你觉得是时钟的问题,能不能帮忙解释下具体是怎么从时钟不精确导致结果差异的。谢谢~Thread.sleep()的文档上有注释的,你可以看看。
    写个例子,你运行一下看看你电脑的时钟精度,反正我每次都不会正好50的public static void main(String[] args) throws InterruptedException {
    int count = 0;
    while(count ++ < 30){
    long start = System.nanoTime();
    Thread.sleep(50);
    long end = System.nanoTime();
    System.out.println((end-start) / 1000000.0);
    }
    }

    额,可能还是我的问题表述不够清楚哈。我的意思是:对,时钟精度会导致每次sleep()的时间不是精确的50ms或者1000ms或者其他时间长度。这个是必然的,但是——为什么这样的误差会导致上面结果输出会有如此大的差异呢?
      

  9.   

    亲,这个跟你的机器和JVM的运转有关系,首先,在涉及多线程的时候一定要注意对临界资源的访问,另外,多个线程对同一资源的操作具有太多的不确定性,不论它与你想要的结果又多大的差距,最终的结果肯定不能使人满意