JAVA多线程同步问题

ddpmz 2010-06-22 08:47:19
哪位高手告诉我为什么下面代码运行时只有第一个线程
就是只有售票点A
而B,C没打印
class Demo implements Runnable
{
private int ticket = 10 ;
public void run()
{
while(ticket>0)
{
// 加入同步块
synchronized(this)
{
if(this.ticket>0)
{
try
{
Thread.sleep(100) ;
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+" --> 卖票:"+this.ticket--) ;
}
}
}
}
};
public class ThreadDemo15
{
public static void main(String args[])
{
Demo d = new Demo() ;
Thread t1 = new Thread(d,"售票点 A") ;
Thread t2 = new Thread(d,"售票点 B") ;
Thread t3 = new Thread(d,"售票点 C") ;

t1.start() ;
t2.start() ;
t3.start() ;
}
};
...全文
49 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xierangh 2010-06-22
  • 打赏
  • 举报
回复
如果想看到更加正常的现象应该把sleep放在打印后面:

synchronized(this)
{
if(this.ticket>0)
{
System.out.println(Thread.currentThread().getName()+" --> 卖票:"+this.ticket--) ;
}
}
try
{
Thread.sleep(100) ;
}
catch (Exception e)
{
}
若鱼1919 2010-06-22
  • 打赏
  • 举报
回复
因此,可能的输出结果有三种,
售票点 B --> 卖票:10
售票点 B --> 卖票:9
售票点 B --> 卖票:8
售票点 B --> 卖票:7
售票点 B --> 卖票:6
售票点 B --> 卖票:5
售票点 B --> 卖票:4
售票点 B --> 卖票:3
售票点 B --> 卖票:2
售票点 B --> 卖票:1
也是其中一种
若鱼1919 2010-06-22
  • 打赏
  • 举报
回复
3个线程,同一把锁d
while(ticket>0)
{
synchronized(this)

任何一个线程首先执行,while条件满足,获得锁,打印输出,并没有退出while循环,while条件还是满足,因此继续获得锁,执行。
因此,每次运行,只会有一个线程获得执行。



50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧