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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码如下:
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 判断,加锁问题可以解决。但是,却是一个无限循环。。

3 个回复

倒序浏览
本帖最后由 Mr.Ni 于 2014-12-4 04:13 编辑
  1. while(tick>0)//此处存在安全隐患
  2.                 {        
  3.      synchronized(this){//这里加锁啊
  4.         if(tick>0){//再判断一次
  5.            try{Thread.sleep(10);}catch(Exception e){}
  6.            System.out.println(Thread.currentThread().getName()+"--sale: "+tick--);        
  7.         }
  8.     }
  9. }
复制代码
当tick为0时,读while,循环结束即使里面还有线程,读if也不会继续执行,再读while还是循环结束
不知道你说的死循环是怎么回事
回复 使用道具 举报
你想说的是加个同步锁吧?  多线程操作共享数据的语句加上同步就行了    毕老师那个确实是会死循环,要在while里面的if后面加上else break;就可以了    很神奇的是我看毕老师的视频的时候他没死循环,但是我敲一样的代码却会
回复 使用道具 举报
你这个东西代码没有要枷锁的必要,加锁的前提是两个线程在操作共享的资源或者数据,你每次创建一个线程肯定会为这个ticket 的类创建自己的资源,就是tick,你加锁也不可能在线程内锁住自己本身的内部函数的。所以没必要,如果你想加锁,记住了要放在资源是多个线程共享的方法或者类上,不然就没意义。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马