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

一个有关线程问题的疑惑,比较简单,我是新手,请指教下
如下这段代码,我希望打印0-100,但实际运行还是会产生重复的数,我应该怎么改写代码呢,我已经使用了synchronized关键词啊?


public class Test{
 
    public static void main(String[ ] args) {
     ThreadTest a = new ThreadTest();
     for(int i=0;i<100;i++){
     new Thread(a).start();
     a.print();
     }
    }
}

class ThreadTest implements Runnable {
Count c = new Count();

@Override
public void run() {
c.increase();
}

public void print() {
System.out.println(c.getValue());
}
}

final class Count {
private long value = 0;

public synchronized long getValue() {
return value;
}

public synchronized long increase() {
if(value == Long.MAX_VALUE) {
throw new IllegalStateException("error");
}

return ++value;
}
}

------解决方案--------------------
你只是同步了increase方法内部和getValue方法内部,在方面调用之间和与其他方法一块用时,无法保证同步。要想不重复就把打印的代码和增加value的代码放到一个同步代码块里面。
------解决方案--------------------
不知道你的代码想实现一个什么功能。
 new Thread(a).start();
 a.print();
这两行什么意思啊?完全没有体现多线程与同步的思想啊。
你在一个线程里面实现count+1,在主线程里面调用print方法,有什么意义呢?

如下是我修改了你的代码,同时给你一个,我写的一个例子。希望对你有帮助。
public class Test22{
  
    public static void main(String[ ] args) {
     ThreadTest a = new ThreadTest();
        for(int i=0;i<100;i++){
            new Thread(a).start();
//            a.print();
        }
        
        
    }
}
 
class ThreadTest implements Runnable {
    Count c = new Count();
 
    public void run() {
        c.increase();
    }
     
//    public void print() {
//        System.out.println(c.getValue());
//    }
}
 
final class Count {
    private long value = 0;
     
    public synchronized long getValue() {
        return value;
    }
     
    public synchronized long increase() {
        if(value == Long.MAX_VALUE) {
            throw new IllegalStateException("error");
        }
        System.out.println(++value);