本帖最后由 张雪磊 于 2012-8-5 12:36 编辑
/*
需求:简单的卖票程序。
多个窗口卖票。
*/
class Ticket implements Runnable
{
private int tick = 500;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
/*
你说的不错,假如有四个线程A,B,C,D来抢夺执行权,用毕老师的举例说就是锁的开关控制线程的进入,
如果用1来表示锁开,0来表示锁关, 如果A抢到了,当他执行到 synchronized(obj) 后会判断一下锁,
由于 这时候obj是1,也就是锁是开着的,说明里面没有别的线程,那A就可以进入执行里面的代码,当然
在此之前,他会把obj从1改为0,这样即使他执行到下面的Thread.sleep(10); 其他线程也无法进入。当A重新
获取执行权后,就继续往下执行,这样就保证了同步代码块里的程序被同步执行。当A执行完同步代码块
出去后,又会把obj由0改为1这样其他线程由可以继续执行了。 当A执行完后,其他线程都有机会得到执行权,
假如这个时候B抢到执行权,又会把obj由1改为0。然后执行完出来再把0改为1。对于为什么会一下一个线程
打印一大片,这个是由CPU随机决定的,并不存在什么猫腻,这种情况,不同结果概率都有,可能你运行个
成千上万遍才能看到一个结果,没必要太纠结这个。我运行就有一个线程就打了两个,就被其他线程抢走了的情况
*/
{
if (tick>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"卖出:"+tick--);
}
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
|