日期:2014-05-20  浏览次数:20724 次

runnable
将共享数据和操作数据的方法一并封装到Runnable的实现子类中,然后在主方法中new其实例对象,将这个实例对象传个创建的两个匿名Thread对象,并开启运行。为何出现诡异的结果呢?麻烦大家帮忙看看!谢谢先! 
Java code

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);
                }
        }
}





------解决方案--------------------
最基础的,一点也不诡异
复制一段话给你,自己看吧。。。。。。。

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