day11-09-多线程(多线程的安全问题)

2020-05-28  本文已影响0人  姗婷

通过分析,发现打印出0,-1,-2等错误;多线程的运行出现了安全问题
问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行,导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完 。在执行过程中,其他线程不可以参与执行。java对于多线程的安全问题提供了专业的解决方式,就是同步代码块
synchronized(对象)
{
需要被同步的代码
}

class Ticket implements Runnable//extends Thread
{
    private int tick =500;
    Object obj = new Object();//建立对象,传参给synchronized同步代码块
    public void run()
    {
        while(true)
        {
            synchronized(obj)
            {
                if(tick>0)
                {
                    //不能抛,只能try,因为实现的接口方法没有异常
                    try
                    {
                        Thread.sleep(10);
                    }
                    catch(Exception e)
                    {   
                    }
                    System.out.println(Thread.currentThread().getName()+"--sale"+tick--);
                }
            }
        }
    }
}
class TicketDemo3
{
    public static void main(String[] args)
    {
        Ticket t = new Ticket();
        
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        /*
        Ticket t1 = new Ticket();
        //Ticket t2 = new Ticket();
        //t1.start();
        //t2.start();
        */
    }
}
上一篇下一篇

猜你喜欢

热点阅读