日期:2014-05-20  浏览次数:20608 次

一个线程同步的问题 请大家帮忙看看 谢谢啦~
public   class   TestClass   implements   Runnable   {

public   static   void   main(String[]   args)   {
for   (int   i   =   0;   i   <   10;   i++)   {   //******    
                          //是否去掉这个For循环结果有很大的区别.
          Runnable   r   =   new   TestClass();
Thread   t1   =   new   Thread(r);
Thread   t2   =   new   Thread(r);

t1.start();
t2.start();

System.out.println( "   Thread   no   "+i);
}




}

public   synchronized   void   run()   {
System.out.println( "start   "+(new   Date()));
for   (int   i   =   0;   i   <   900000000;   i++)   {
int   temp   =   FatherClass.count;
FatherClass.count   =   FatherClass.count   +   1;
int   result   =   (FatherClass.count   -   temp);

if   (result   !=   1)   {
System.out.println( "--before- "   +   temp);
System.out.println( "--after- "   +   FatherClass.count);
System.out.println( "--differ- "+   (FatherClass.count   -   temp));
}
}
System.out.println( "end   "+new   Date());


}

}

这里的FatherClass类中只是定义了一个静态的属性   public     static     int   count=1;
别的没有什么了.

我写这个线程的本意是想测试一下静态变量在并发访问时候   的情况.
所以我在run()方法中,每次给这个静态变量+1     .如果并发不会产生错误,应该relust=1.如

果并发中产生了问题,则输出结果.

测试结果是这样.:  
1.   如果是在main函数中,不加for循环,因为我在run方法中加了synchronized   修饰,一切是

Ok的,即使启动10个线程也是没有问题的.result始终是1,     测试通过..
2.我在main方法中加入了一个for循环,建立i个不同的线程对象.测试结果是:   运行时候有

result!=1   的情况

    我自己想了一下原因,觉得是这个原因,不知道对不对,大家给看一下:  
synchronized   是保证同一个线程对象的同步,   我用for循环启动了好多线程对象,   它并不

保证不同的线程对象同步,这些不同的线程对象又是修改的同一个静态变量  
当运行int   temp   =   FatherClass.count的时候,   temp=当时内存中   count的值,   但是运行


FatherClass.count   =   FatherClass.count   +   1;的时候,   再次从内存中获取count的值的时

候,已经被其他的线程修改了..所以产生了不一致..

      我是根据结果去想,也不知道对不对.   大家给看一下.   如果对的话,那么在多线程修改

静态变量的时候,应该采用什么办法保证没有问题呢?   如果不对,大家给解释一下..

谢谢了..

  我在做这个测试的时候,还发现一些其他的原来学java没有太在意的事情,比如

如果我将FatherClass的静态变量count声明为private   然后再写一个public的getCount()
方法,返
回这个静态变量,   在TestClass程序中,   这样使用:   FatherClass   fc   =   new   FatherClass(
);   int   temp   =   fc.getCount();         采用这样的方法   与   声明为静态变量,然后使用类名.
静态变量的方法   ,速度差别特别大.

------解决方案--------------------