美文网首页
day11-09-多线程(多线程的安全问题)

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

作者: 姗婷 | 来源:发表于2020-05-28 10:22 被阅读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();
            */
        }
    }
    

    相关文章

      网友评论

          本文标题:day11-09-多线程(多线程的安全问题)

          本文链接:https://www.haomeiwen.com/subject/ekknahtx.html