将共享数据和操作数据的方法一并封装到Runnable的实现子类中,然后在主方法中new其实例对象,将这个实例对象传个创建的两个匿名Thread对象,并开启运行。为何出现诡异的结果呢?麻烦大家帮忙看看!谢谢先! public class SaleTickets{
        //static Tickets  tickets = new Tickets();//这里和(1)处除了他是随类的创建而创建,
                                                //存储在静态区,以及共享外还有什么区别吗?
        public static void main(String[] args) {
                 Tickets  tickets = new Tickets();//(1)
                new Thread(tickets).start();//调用tickets身上的run方法将count--
            new Thread(tickets).start();//也是调用tickets身上的run方法将count--
        }
}
//将共享数据和操作数据的方法一并封装到Runnable的实现子类中
class Tickets implements Runnable{
        private int count = 10000;
        @Override
        public /*synchronized*/ void  run(){//这里为何加上同步另外一个进程就无法启动呢?
                while(true){
                 count--;
                 System.out.println(Thread.currentThread().getName()+"|"+count);
                }
        }
}

解决方案 »

  1.   

    最基础的,一点也不诡异
    复制一段话给你,自己看吧。synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
      

  2.   

    如果没有synchronized,两个线程的count都是独立的,所以都是单独计算的。加上两个线程共享count,因为主要在计算第一个线程,第二个没有得到锁所以不运行,在while(true) 中加入Thread.sleep(100);
    就可以了
      

  3.   

    count是共有变量,而且因为是互斥的,所以当前运行的时候另一个不能运行吧,得到运行的线程一直占有者锁
      

  4.   

                    new Thread(tickets).start();//调用tickets身上的run方法将count--
                new Thread(tickets).start();//也是调用tickets身上的run方法将count--
    你两个线程调的是同一对象,使用synchronized进入其中一个run方法,就会上锁,等它释放锁其它线程才能进来,但是run方法里是无限循环,所以根本出不来