黑马程序员技术交流社区

标题: 关于售票程序的一个小问题 [打印本页]

作者: libra    时间: 2013-11-16 19:29
标题: 关于售票程序的一个小问题
package day11.thread;

/**
* 简单的售票程序。多个窗口同时售票。
* 注意给共同数据tick用static修饰,使其与创建的窗口无关。
* @author Administrator
*
*/
public class ThreadDemo3 {

        public static void main(String[] args) {
                Ticket t1 = new Ticket();
                Ticket t2 = new Ticket();
                Ticket t3 = new Ticket();
               
                t1.start();
                t2.start();
                t3.start();
        }

}

class Ticket extends Thread {
        private static Object obj = new Object();
        private static int tick = 100;
        public void run() {
                while(true) {
//                        synchronized(obj) {
                                if(tick > 0) {
                                        System.out.println(this.getName() + " sale: " + tick--);
                                }
//                        }
                }
        }
}


没有注释的情况下售票情况是连续的售到第一张票,而有注释的情况下售票不是连续的为什么?(不考虑没有同步代码块而出现的安全问题)
作者: Weix1992    时间: 2013-11-16 19:46
没有注释的情况下,就给那个方法加锁了,别的对象调用这个方法,但是进不来,一定要等到别的对象用完,下一个进程才能进来,所以连续了。。。

加注释了就没这个限制了,t1用2秒后CPU干别的区了过会再来继续,这时候,t2也进来用用一会也干别的去了等下再回来~。

不知道能理解吗
作者: 天ya~_琼楼    时间: 2013-11-16 21:07
synchronized为锁。
你不加注释时,锁就起到作用,其他线程进不来,只有等这一条结束了,其他线程才能运行,而这一线程结束时,票已经收光了,所以看到的是一直连续的售到第一张票,并结束了程序。
当把锁注释掉以后,就没有锁了,程序中开了三个线程,因此都会开启售票,因为tick使用了static修饰,则三个线程公用这100张票,售出的也是这100张票,而不是每个线程各有100张票,因此会有不连续。比如线程1售出第100张,线程2售出第99、98张,线程3售出第97张……如此交替。
就像实际的售票窗口:例如一个火车站有三个窗口,只有北京到上海的100张票,而此时让所有的顾客都集中的1窗口卖票,就是连续的。而三个窗口同时卖票,每个窗口卖出的票的号码肯定不会是连续的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2