微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

一个有关线程问题的疑惑,比较简单,我是新手

时间:2014-04-11 00:19  浏览:努力统计中...
如下这段代码,我希望打印0-100,但实际运行还是会产生重复的数,我应该怎么改写代码呢,我已经使用了synchronized关键词啊? publicclassTest{ publicstaticvoidmain(String[]args){ ThreadTesta=newThrea
如下这段代码,我希望打印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的代码放到一个同步代码块里面。

谢谢 经过楼上提醒 我把代码改成了这样 问题貌似解决了 但是又有一个新问题了,我把Count类中的synchronized去掉,打印的结果居然跟同步的一模一样。这样怎么才能区分出synchronized的同步性呢?


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

@Override
public void run() {
c.increase();
System.out.println(c.getValue());
}

public void print() {
}
}


不知道你的代码想实现一个什么功能。
 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);
        return value;
    }
}


public class VolatileTest {

static Integer count = 0;

static volatile Integer countVolatile = 0;
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------