买票(1)

有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;
                }
            }
        }
    }
}

你可能感兴趣的:(java)