如下这段代码,我希望打印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);