线程中的while(true){
   if(mdat.lists.size()>0)//mdat是静态变量
}
///执行中mdat的数据会增加
//我有另一个线程一直在打印mdat的size是>0的
//但是在线程中的if就是进不去,只有在while中Thread.sleep(100);才能进入
//我想知道是什么原因造成的Java多线程

解决方案 »

  1.   

    静态变量就是共享变量嘛,试试用 synchronized 块包含一下用到mdat或者是修改mdat的地方
      

  2.   

    一楼的这种方式,在new Tread的时候要传入同一个Runnable对象就可以。 你也可以对 静态成员变量加一个类锁。
      

  3.   

    变量是从共享内存读取的,发生修改时,可能不会立即修改共享内存里的这个变量值。线程处理速度很快的情况下就很明显。sleep就延缓了线程的处理速度,有时间修改共享内存的值
      

  4.   


    我也试过了,在不sleep的情况下,在静态变量被修改后,一直打印了近1分钟都没进入if去处理前面几位说的使用锁没有试过,但看到这个锁我就不太想使用
      

  5.   

    你的那个变量可以加个修饰符:volatile试试,虽然不能即时生效,应该过了1分钟肯定会变化的。
      

  6.   


    我也试过了,在不sleep的情况下,在静态变量被修改后,一直打印了近1分钟都没进入if去处理前面几位说的使用锁没有试过,但看到这个锁我就不太想使用你是否正确对静态变量mdat成功得赋值?
    是可以试着debug一下,看看当线程跑到 if(mdat.list.size()>0)的时候,mdat的内存是什么?举个例子,你在另一个线程,以参数引用的方式,对mdat进行赋值,但是因为某些错误的写法,其实没有真正把内容写入到静态变量mdat中,于是在本线程,mdat一直都是空的。。仅供参考。。
      

  7.   


    我也试过了,在不sleep的情况下,在静态变量被修改后,一直打印了近1分钟都没进入if去处理前面几位说的使用锁没有试过,但看到这个锁我就不太想使用你是否正确对静态变量mdat成功得赋值?
    是可以试着debug一下,看看当线程跑到 if(mdat.list.size()>0)的时候,mdat的内存是什么?举个例子,你在另一个线程,以参数引用的方式,对mdat进行赋值,但是因为某些错误的写法,其实没有真正把内容写入到静态变量mdat中,于是在本线程,mdat一直都是空的。。仅供参考。。赋值是使用list.add方法赋值后打印出来size,是成功赋值的
    环境是
    jdk6,linux 运行参数是 jar -server
    extends java.lang.Thread
      

  8.   

    之所以出现这个状况,涉及到一些理论知识:指令重排序和happen-before法则,不太好解释,楼主去把这两个概念搞懂应该就能明白。
    http://www.blogjava.net/xylz/archive/2010/07/03/325168.html在这里,楼主可以尝试使用线程安全的集合就可以了。
    例如List list = Collections.synchronizedList(new ArrayList());