黑马程序员技术交流社区

标题: 卖票啦 黑马的入学门票 见者有份 赶紧围观哦~~~~~~~~~~~~~~~~~~~~ [打印本页]

作者: 李斌    时间: 2012-5-23 21:38
标题: 卖票啦 黑马的入学门票 见者有份 赶紧围观哦~~~~~~~~~~~~~~~~~~~~

不多说 先送上金币 嘿嘿

问题:在没有同步的情形下,既然线程会执行判断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--);
                                }
                        }
                }
        }
}




作者: 黄奕豪    时间: 2012-5-23 21:59
本帖最后由 黄奕豪 于 2012-5-23 22:01 编辑

这个木有可能,进去以后就意味着要关门,这是同一行代码synchronized(obj)实现的两种功能,就像你给变量赋值,i = 5 ;执行这行代码的过程中,你能说我把5从常量池中取出来了,但是没给到 i 就停了吗?不可能,一个CPU周期的东西,怎么能停呢,你泼水,泼了一半,动作停了,盘子还是倒立的形状,水也会自动都流光~~~~个人觉得~~这种问题真没必要去深究~~~~
作者: 游兴钟    时间: 2012-5-24 03:53
  楼主可以从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)这句话的同时就是一个上锁的过程。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2