一个线程同步的问题 请大家帮忙看看 谢谢啦~
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(); 采用这样的方法 与 声明为静态变量,然后使用类名.
静态变量的方法 ,速度差别特别大.
------解决方案--------------------