A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 爱java爱生活 中级黑马   /  2015-6-4 18:45  /  313 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


                        /**
                        线程的安全隐患问题代码;
附注释部分是线程出现隐患的愿意吧也算是(自己总结的):其实是因为线程(Thread-1)操作共享数据num时,当这个线程里面有多条操作共享数据num的代码时这边还没处理完数据,其他线程(Thread-2)已经参与进来了,也要操作共享数据num,等Thread-2操作完,这时共享数据num已经发生改变,当线程Thread-1再次处理时就会出现问题了;       
                               
                        */


class Ticket2 implements Runnable
{
                         private int num=100;
                        public void run()
                        {
                        try {
                                       
                                                        Thread.sleep(10);
                                       
                                }catch(InterruptedException e) {}
                                                                for(int i=0;i<100;i++)
                                                                {
                                                                        try
                                                                        {
                                                                                Thread.sleep(10);
                                                                        }catch(InterruptedException e) {}//短暫的休眠就會出現這個num為0后,後面還有要運行的線程,并且已经参与进来了,所以就會出現num還要減小,知道最後剩下的線程運行完了再比較才會退出了所以輸出了0,-1,-2
                                                                        if(num>0)
                                                                        {
                                                       
                                                                                       System.out.println(Thread.currentThread().getName()+"......................................"+num--);
                                                                        }
                                                                }
                        }

}
public class Test2
                        {
               
                               
                                                public static void main(String[] args)
                                                        {
                                                                Ticket2 t=new Ticket2();
                                                                Thread t1=new Thread(t);//把线程任务封装在Ruannable 接口中,任务不变,只是创建多个Thread对象并把任务传进去,让Ruannable他们去卖;
                                                                Thread t2=new Thread(t);
                                                                Thread t3=new Thread(t);
                                                                Thread t4=new Thread(t);
                                                                t1.start();
                                                                t2.start();
                                                                t3.start();
                                                                t4.start();
                                                               
                                                        }
                       
                        }

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马