买票(1)

来源:互联网 发布:四维星装饰选材软件 编辑:程序博客网 时间:2024/05/22 12:36

有100张票,各个车站都在卖,那么设计了多线程和线程安全的问题
方式一用线程同步锁synchronized
synchronized 声明在函数前或者声明在代码块之前(即:{}之前)

class ChePiao1 implements Runnabel{    public static int chepiao=100;--static 静态,作用是当同一个类被new多次时共享该变量    String aa=new String('1');    public void run()    {        while (true)        {            synchronize(aa)            {                if(chepiao>0)                {                    System.out.println(Thread.currentThread.getName()+"卖出了序号为"+(101-chepiao)+"的票");                    chepiao--;                      }                else                {                    break;                }            }        }    }}public class MaiPiao1{    public static void main(String[] args)    {        ChePiao mp1=new ChePiao();        **Thread chezhan1=new Thread(mp1);**        chezhan1.setName("重庆车站");        chezhan1.start();        **Thread chezhan2=new Thread(mp1);**        chezhan2.setName("成都车站");        chezhan2.start();        //上述注意的问题:线程同步问题,必须要等一个车站售完后里一个车站才能卖,还有就是在此处加粗的不分,公用一个cp1,所以能共享变量车票(chepiao),公用一把锁(aa)    }}

方式二:

public class Maipiao2 {    public static void main(String[] args)    {        ChePiao2 xc1=new ChePiao2();        xc1.setName("重庆车站");        xc1.start();        ChePiao2 xc2=new ChePiao2();        xc2.setName("成都车站");        xc2.start();    }}class ChePiao2 extends Thread{    public static int chepiao=100;    public static String aa=new String("1");//由于要new两个该对象,为了保证共公用一把锁,加上static    public void run()    {        while(true)        {            synchronized(aa)            {                if(chepiao>0)                {                    System.out.println(Thread.currentThread().getName()+"卖出了序号为"+(101-chepiao)+"的票");                    --chepiao;                }                else                {                    break;                }            }        }    }}
0 0