public class MyThread extends Thread{
private static int ticketNum = 0;
public MyThread(String name){
super(name);
}
public void run(){
while(ticketNum<1000){
print();
}
}

public synchronized void print(){
MyThread.ticketNum = 1+MyThread.ticketNum;
System.out.println(this.getName()+"卖票一张,编号:\t"+MyThread.ticketNum);
}

}

解决方案 »

  1.   


    MyThread mt1 = new MyThread("窗口1");
    MyThread mt2 = new MyThread("窗口2");
    MyThread mt3 = new MyThread("窗口3");
    MyThread mt4 = new MyThread("窗口4");
    mt1.start();
    mt2.start();
    mt3.start();
    mt4.start();用上面四个线程测试,结果打印时还是有乱序(不是1-1000的顺序)。
      

  2.   

    各个线程实际上都是在不同的实例中执行各自的同步方法,根本就没有形成竞争用同一个Runnable对象试试
      

  3.   

    这样没有同步,4个线程各自运行各自的synchrinized 方法,不存在同步。楼主把后面代码改一下试试:MyThread mt=new MyThread("mt");
    Thread t1=new Thread(mt,"窗口1");// 四个线程运行同一段代码,同步对象是一个mt.
    Thread t2=new Thread(mt,"窗口2");
    Thread t3=new Thread(mt,"窗口3");
    Thread t4=new Thread(mt,"窗口4");t1.start();
    t2.start();
    t3.start();
    t4.start();
      

  4.   

    lz你synchronized 其实锁的是对象而你new了4个对象,所以你肯定锁不住,4个对象之间互不影响
      

  5.   


    public class MyThread extends Thread {
    private static int ticketNum = 0; public MyThread(String name) {
    super(name);
    } public void run() {
    while (ticketNum < 1000) {
    print();
    }
    } public synchronized void print() {
    MyThread.ticketNum = 1 + MyThread.ticketNum;
    System.out.println(this.getName() + "卖票一张,编号:\t" + MyThread.ticketNum);
    }
    public static void main(String[] args) {
    new MyThread("").start();
    }}
    运行非常正常
      

  6.   

    同意楼上!说的太好了
    MyThread mt1 = new MyThread("窗口1");MyThread mt2 = new MyThread("窗口2");MyThread mt3 = new MyThread("窗口3");MyThread mt4 = new MyThread("窗口4");mt1.start();mt2.start();mt3.start();mt4.start();
    改成楼上的代码就行了
      

  7.   

    其实有个更简单的办法不要锁对象,直接锁类就OK了你在synchronized 前加个static 让他变为静态的锁类就OK了
      

  8.   

    但static方法中如果要用到对外在的非static变量的引用就受限了,比如this
      

  9.   

    楼上的各位说得都非常好,new了四次,已经不是同一把对象锁了。分就平均分给各位了。