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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任雷彬 中级黑马   /  2012-10-31 14:49  /  2164 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么在类Tick中加入try...catch....异常处理代码后,
会再代码运行后出现0, -1或者-2的异常,虽然知道是存在不安全问题,但是究竟是一个什么样
的运行机制,和实现方法,还是有些疑惑,这是为什么呢?

class Tick implements Runnable//extends Thread
{
        private  int tick = 50;
        public void run()
        {
                while(true)
                {
                        if(tick>0)
                        {try{Thread.sleep(10);}catch(Exception e){}//加入try...catch处理,
                                                                                                    //出现0,-1或-2异常为什么?

                                System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
                        }
                }
        }
}


class  TicketDemo
{
        public static void main(String[] args)
        {

                Tick t = new Tick();

                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();
        }
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
因为在多线程里面,像你的程序,会有四个线程同时去操作一个资源。
当你的资源到达临界状态,就是  tickets = 1;的时候,这时候有两个以上的线程同时去访问这个资源了,他们得到的数据都是tickets = 1;判断是否大于0 ,都成立,于是那些线程就同时对它进行了减一操作,你想,如果三个线程都把 1 减掉了 1,就相当于减了三,可不就等于 -2 了?如果这时候是两个线程,那就是减了 2 可不是 -1,如果运气好,那时候只有一个线程正好访问到,那就是正确答案,所以这里会出现异常,而且是不一定的。这就是后面要引入那些知识点的原因

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
xuchulong1 发表于 2012-10-31 15:07
因为在多线程里面,像你的程序,会有四个线程同时去操作一个资源。
当你的资源到达临界状态,就是  tickets ...

听你这么说到时有些是这个样子的意思,

明白,明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马