本帖最后由 刘 佳 于 2012-10-13 15:58 编辑
卖票的例子,我用的for循环,到同步代码块就不适用了。我的程序是错的,但是跟我想象的运行结果不同。
代码如下(代码是错的,不用纠正,我想搞清楚运行结果为什么跟我想的不同)程序一是交替执行abc线程,而程序二则跟我想的一致。这两种线程建立方式有什么不同?
*
程序一
class Ticket extends Thread
{
private static int tick=100;
Ticket(String name)
{
super(name);
}
Object obj=new Object();
public void run()
{
synchronized (obj) //我想的是,a线程进入到同步代码块中,b和c线程就进不来了,直到a执行完for循环,也就是从1到100张票都卖光。
{ //就相当于只有a线程在卖票,bc线程没有卖票。可是结果却是abc都在卖票,我不理解明明加了同步,怎么bc还可以执行for循环的内容呢?
for (;tick>0 ;tick-- )
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(currentThread().getName()+tick);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket a=new Ticket("一窗口");
a.start();
Ticket b=new Ticket("二窗口");
b.start();
Ticket c=new Ticket("三窗口");
c.start();
}
}
程序二
class Ticket implements Runnable
{
private int tick=100;
public void run()
{
synchronized (new Ticket())
{
for (;tick>0 ;tick-- )
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(currentThread().getName()+tick);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread a=new Thread(t);
Thread b=new Thread(t);
Thread c=new Thread(t);
a.start();
b.start();
c.start();
}
}
|