黑马程序员技术交流社区
标题:
卖票啦 黑马的入学门票 见者有份 赶紧围观哦~~~~~~~~~~~~~~~~~~~~
[打印本页]
作者:
李斌
时间:
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