public class Chess implements Runnable{
   public void run(){
      move(Thread.currentThread().getId());
      
   }
   synchronized void move(long id){
      System.out.println(id+" ");
      System.out.println(id+" ");
   }
   
   public static void main(String[] args) {
      Chess ch = new Chess();
      new Thread(ch).start();
      new Thread(new Chess()).start();
   }
}
为什么是交替出来呢?非常不解。

解决方案 »

  1.   

    首先说,你这段程序中,move() 上的 synchronized 没用,因为作为实例方法,它根本就不会被并发调用(你的两个线程对象用的是两个各自独立的 Chess 对象)。所以,交替也好,先后也好,应该是随机的。
    ■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    你synchronized 没有锁住同一个对象,要么改成
    new Thread(ch).start();
    new Thread(ch).start();
    要么把同步做到类一级的
    synchronized static void move(long id)
      

  3.   

    因为new的两个线程都有各自的move方法,并不会相互干涉不是并发的所以输出时随机的,如果加static那就是该类的所有对象公用了 所以加锁就生效了
      

  4.   

    这种随机性不一定很容易看出来。你可以在你原来程序的基础上,把 move() 里的输出改成循环输出 1000 次,然后运行两次再比较结果。
    ■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  5.   

    synchronized 需要有一个锁才能同步,而 move 方法的锁对象是 Chess 对象本身。也就是说,两个线程各自使用两个 Chess 对象作为锁,这样当然不会同步了。
      

  6.   

    所有的线程必须用同一个锁才能同步。这里是一个例子:
    public class ThreadLockDemo implements Runnable {    public void run() {
            while (true) {
                synchronized (ThreadLockDemo.class) {
                    System.out.println("ticking " + Thread.currentThread().getId());
                    System.out.println("ticking " + Thread.currentThread().getId());
                }            try {
                    Thread.sleep(500L);
                } catch (InterruptedException e) {
                    //
                }
            }
        }    public static void main(String[] args) {
            new Thread(new ThreadLockDemo()).start();
            new Thread(new ThreadLockDemo()).start();
        }
    }
      

  7.   

    synchronized 是锁住当前对象资源,不让其他的对象访问该对象资源,move的参数根本不是同一个资源,根本谈不上锁,楼主的程序就是一个多线程列子。谁获得cpu就调度输出自己的id。
      

  8.   

    9楼的正解!
    方法加上 static synchronized 两个修饰,这样结果就是你的预期了。
      

  9.   

    这个现象跟JVM有关系,如果你要实现生产者-消费者,必须另做线程同步处理。