黄焖鸡米饭啊 2016-05-19 05:48 采纳率: 50%
浏览 1192
已结题

线程同步 卖票问题 三个车站卖七张票

正确的写法:public class mainclass {
public static void main(String[] args) {
Train A=new Train();
Train B=new Train();
Train C=new Train();
A.start();
B.start();
C.start();

}
}
class Train extends Thread{
public static int ticket=7;
public void run(){
{
A();
}
}
public synchronized void A(){
while (ticket>0){
System.out.println("第"+this.getName()+"站卖出第"+ticket--+"张票");

        } 
     }      
}
出现问题的写法:public class mainclass {
public static void main(String[] args) {
    Train A=new Train();
    Train B=new Train();
    Train C=new Train();
    A.start();
    B.start();
    C.start();      
}

}
class Train extends Thread{
public static int ticket=7;
public void run(){
{
A();
}
}
public synchronized void A(){
while (ticket>0){
System.out.println("第"+this.getName()+"站卖出第"+ticket+"张票");
ticket--;

        } 
     }      
}
在A()函数之中ticket--的位置不同却出现了两种结果。一种将ticket--写在输出语句里,结果正确,但一种写在输出语句之外就会出现线程同步问题,可是我已经在函数前面加了synchronized,为什么会这样,按理来说两者应该一样啊。
  • 写回答

1条回答 默认 最新

  • lbcab 2016-05-19 06:02
    关注

    你把while(ticket) 包含在synchronized同步块中, 导致只有一个线程在跑, 因为一个线程进入while循环后, 直到ticket的值小于0才会退出循环, 才会释放
    synchronized同步块, 这样其他线程才能进入A()方法, 这时候ticket的值已经小于0了.
    将代码改为:

     public void A(){
           while (ticket>0){
                   synchronized(this) {
                    System.out.println("第"+this.getName()+"站卖出第"+ticket+"张票");
                    ticket--;
                                }
                    }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程