A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© libra 中级黑马   /  2013-11-16 19:29  /  1291 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


没有注释的情况下售票情况是连续的售到第一张票,而有注释的情况下售票不是连续的为什么?(不考虑没有同步代码块而出现的安全问题)

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

2 个回复

倒序浏览
没有注释的情况下,就给那个方法加锁了,别的对象调用这个方法,但是进不来,一定要等到别的对象用完,下一个进程才能进来,所以连续了。。。

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

不知道能理解吗

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 如果能详细一点再加上代码什么的就更好了.

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马