黑马程序员技术交流社区
标题:
多线程——安全问题——锁加在哪里
[打印本页]
作者:
江南小道士
时间:
2014-12-4 03:02
标题:
多线程——安全问题——锁加在哪里
代码如下:
class Ticket implements Runnable
{
private static int tick = 40;
public void run()
{
while(tick>0)//此处存在安全隐患
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"--sale: "+tick--);
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
这个代码能加锁吗?
毕老师中的视频中,while(true),下面再用 if 判断,加锁问题可以解决。但是,却是一个无限循环。。
作者:
Mr.Ni
时间:
2014-12-4 04:11
本帖最后由 Mr.Ni 于 2014-12-4 04:13 编辑
while(tick>0)//此处存在安全隐患
{
synchronized(this){//这里加锁啊
if(tick>0){//再判断一次
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"--sale: "+tick--);
}
}
}
复制代码
当tick为0时,读while,循环结束即使里面还有线程,读if也不会继续执行,再读while还是循环结束
不知道你说的死循环是怎么回事
作者:
Quasimodo
时间:
2014-12-5 01:03
你想说的是加个同步锁吧? 多线程操作共享数据的语句加上同步就行了 毕老师那个确实是会死循环,要在while里面的if后面加上else break;就可以了 很神奇的是我看毕老师的视频的时候他没死循环,但是我敲一样的代码却会
作者:
wangcongwu
时间:
2014-12-5 11:05
你这个东西代码没有要枷锁的必要,加锁的前提是两个线程在操作共享的资源或者数据,你每次创建一个线程肯定会为这个ticket 的类创建自己的资源,就是tick,你加锁也不可能在线程内锁住自己本身的内部函数的。所以没必要,如果你想加锁,记住了要放在资源是多个线程共享的方法或者类上,不然就没意义。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2