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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


不多说 先送上金币 嘿嘿

问题:在没有同步的情形下,既然线程会执行判断if语句后 在执行到打印语句前 有可能处于冻结状态,并导致安全问题        那么有没有可能出现这种情况:在加上同步代码块后,线程1进入同步代码块后 并在if判断之前,忘记“关门”,而让其他线程2
                                进来,导致安全问题呢??因为关门的动作也也是一个执行步骤,应该也存在和没有同步之前一样的问题呀?
                                为什么彼能出问题,而此类似的问题就不会出呢??


class Ticket implements Runnable
{
        private  int tick = 1000;//tick是共享数据
        Object obj = new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {---------------------------》一进来 就挂住在这 并且没有“关门” ,有没有可能 为什么呢?
                                if(tick>0)
                                {
                                        //try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
                                }
                        }
                }
        }
}



评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

2 个回复

倒序浏览

回帖奖励 +1

本帖最后由 黄奕豪 于 2012-5-23 22:01 编辑

这个木有可能,进去以后就意味着要关门,这是同一行代码synchronized(obj)实现的两种功能,就像你给变量赋值,i = 5 ;执行这行代码的过程中,你能说我把5从常量池中取出来了,但是没给到 i 就停了吗?不可能,一个CPU周期的东西,怎么能停呢,你泼水,泼了一半,动作停了,盘子还是倒立的形状,水也会自动都流光~~~~个人觉得~~这种问题真没必要去深究~~~~
回复 使用道具 举报
  楼主可以从1.5出现的显式锁理解
                     lock.lock();
                               if(tick>0)
                                {
                                        //try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
                                }
                              lock.unlock();
这样就可以理解为读到synchronized(obj)这句话的同时就是一个上锁的过程。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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