黑马程序员技术交流社区
标题:
关于售票程序的一个小问题
[打印本页]
作者:
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