车票系统——synchronized语句,同步进程

车票系统——synchronized语句

  1. 需要同步,两个车站,一个站点车票卖完了,总体数量要减1
  2. 可以用接口implement  runnable   也可以用继承类extends Thread
  3. 主程序中采用while  (true){},if   else {break }语句,在public void run()中实现
  4. 实现同步a需要有public static  (定义票数,若没有static,则总体数量各自运行)
    b需要synchronized 语句,他的作用是,让它所管辖的代码部分,要么全部执行完,要么全部不执行,若没有此语句,则第一张票会导致重复,用法
    一定义字符串 String aa = new String("1");  //字符串随意定义,定义在函数上边
    synchronized (aa)此语句放在whiletrue)语句中

 

一下为三个示例:第一个没有synchronized语句,第二个采用

 

售票系统1:

   不能自动同线程识别其他站点车票是否卖完,第一张车票会重复

 

若不加public static则会如下结果

class Xc8 implements Runnable

{

    public static int  chepiao = 100;

      

    public void run()

    {

       while (true)

       {

           if (chepiao > 0)

           {

              System.out.println(""+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");

              --chepiao;

           }

           else

           {

              break;

           }

       }

    }

}

 

public class L68

{

    public static void main(String[] args)

    {

       Xc8 xc81=new Xc8();

       Thread ee = new Thread(xc81);

       ee.start();  

      

       Xc8 xc82=new Xc8();

       Thread ff = new Thread(xc82);

       ff.start();      

    }

}

 

案例二:采用接口

class Xc9 implements Runnable

{

    public static int chepiao = 100;

    String aa = new String("1");  //字符串随意定义,定义在函数上边

      

    //synchronized 的作用是,让它所管辖的代码部分,要么全部执行完,要么全部不执行

    public void run()   //synchronized修饰函数不需要字符串,相当于默认是this

    {

       while (true)

       {

           synchronized (aa//既可以修饰代码块,又可以修饰函数

           {

              if (chepiao > 0)

              {

                  System.out.println(""+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");

                  --chepiao;

              }

              else

               {

                  break;

               }

           }

       }

   }

}

 

public class L69

{

    public static void main(String[] args)

    {

       Xc9 xc9=new Xc9();

       Thread ee = new Thread(xc9);

       ee.start();  

             

       Thread ff = new Thread(xc9);

       ff.start();      

    }

}

 

案例三:继承类

class Xc10 extends Thread

{

    public static int chepiao = 100;

    public static String aa = new String("1");

    public void run()

    {

       while (true)

       {

           synchronized (aa// 两个线程的aa是线程自己的,并不是公共的

           {

              if (chepiao > 0)

              {

                  System.out.println(""+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");

                  --chepiao;

              }

              else

               {

                  break;

               }

           }

       }

   }

}

 

public class L610

{

    public static void main(String[] args)

    {

       Xc10 xc1=new Xc10();

       xc1.start(); 

             

       Xc10 xc2=new Xc10();

       xc2.start();     

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值