public  class Threadtest extends  Thread{
private static long  number=0;
Object a=new Object();
public Threadtest(){

}
public synchronized  void go(){
number++;
System.out.println("当前值:"+number);
}

public void run(){
for(;;){
go();
try {
Thread.sleep(1000); //test 间隔1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}

} /**
 * @param args
 */
public static void main(String[] args) {
Threadtest[] statethread=new Threadtest[10];
for(int i=0;i<statethread.length;i++){
statethread[i]=new Threadtest();
statethread[i].start();
} }}
我的目的就是每个线程数字的加1和输出能够顺序执行,在打印的结果中每个数字只打印一次(顺序无所谓)
请大家指点!

解决方案 »

  1.   

    需要注意:在这里public synchronized  void go()是根本没有同步的。这里只是同步了对象,意思就是说,对于访问该对象的所有线程进行了同步,而在你的事例中,每次都是new一个实例出来,所以和没同步是一样的,所以才会出你说的那种结果。
      你应该在go方法中写
         synchronized(this.class){
      
           ......
         }
     才能达到你要的目的。  我发现很多人没有搞清楚锁对象和所类的区别,包括在很多论坛的教程里面,都是认为简单的在方法上加上synchronized就可以线程安全了。
      

  2.   

    同步锁标志根本不一样..
    你应该写一个标志一样的.
    如你定义一个static 变量 ,用static变量来同步
      

  3.   

    或者改成
    这样
    public static void main(String[] args) {
    Thread test=new Threadtest();
    for(int i=0;i<10;i++){
    test.start();
    } }
      

  4.   

    如要真正用10个线程来实现的话.你需要把
    public  class Threadtest extends  Thread
    改为
    public class Threadtest implements Runnable
    {
    }
    然后在main方法中
    public static void main(String[] args) {
    Threadtest test=new Threadtest();
                       Thread [] tt = new Thread[10];
                           
    for(int i=0;i<tt.length;i++){
    tt[i]=new Thread(test);
                                tt[i].start();
    }
    }
      

  5.   

    对,通过static 变量锁go方法也可以锁住所有实例,不过其实不必,this.class作为同步锁已经可以对所有实例的该方法加锁了,或者把go方法变为static也行
      

  6.   

    希望这个代码能给你帮助import java.util.*;
    import java.io.*;
    import java.awt.*;class MyValue {
    private long i = 0;

    public synchronized long getI() {
    return i++;
    }
    }class MyThread extends Thread {

    private MyValue i;

    public MyThread(String s, MyValue x) {
    super(s);
    i = x;
    }

    public void run() {
    while(true){
    System.out.println(getName() + "   " + i.getI());
    yield();
    }
    }
    }public class Test {
       public static void main(String[] args) {
    // TODO Auto-generated method stub

    //设置一个定时器,程序100毫秒后结束
    (new Timer()).schedule(new TimerTask(){
    public void run(){
    System.exit(0);
    }
    },100);

    MyValue mv = new MyValue();
    MyThread[] mt = new MyThread[10];
    for(int i=1; i<=10; i++) {
    mt[i-1] = new MyThread("线程"+i, mv);
    mt[i-1].start();
    }
    // System.out.println("");

    }}