黑马程序员技术交流社区
标题:
求教 为什么加了syncronized同步代码块仍然出现负票
[打印本页]
作者:
@在路上
时间:
2014-12-2 22:11
标题:
求教 为什么加了syncronized同步代码块仍然出现负票
本帖最后由 @在路上 于 2014-12-2 22:16 编辑
class MaiPiao implements Runnable// extends Thread
{ private int ticket =100; //static 生命周期过长
public void run()
{
while (true)
{ synchronized(this)
{
if(ticket>0)//子类抛出的异常类型不能比父类抛出的异常类型更宽泛 因为是接口
try{Thread.sleep(10);}catch(Exception e){} //将这行注释才不会出现负票求解
System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);
//Thread.currentThread中的Thread类为何能不能省略
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
MaiPiao p=new MaiPiao();
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(p);
Thread t4=new Thread(p);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
刚又看了下是if()没加{} :L
作者:
龙骑将杨影枫
时间:
2014-12-2 22:50
因为你少加了对括号。
注意看这里:
if(ticket>0)//子类抛出的异常类型不能比父类抛出的异常类型更宽泛 因为是接口
try{Thread.sleep(10);}catch(Exception e){} //将这行注释才不会出现负票求解
System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);
我格式化写一下
if(ticket>0)
try{Thread.sleep(10);}catch(Exception e){} ;//这是第一句
System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);//这是第二句
换句话说,只有当ticket>0 时才进行 第一句。而无论ticket如何取值,是不影响第二句的。
当你把第一句注释掉,第二句当然变成了第一句,也就是标准的if结构。
你只要
if(ticket>0) {
try{Thread.sleep(10);}catch(Exception e){} ;//这是第一句
System.out.println(Thread.currentThread().getName()+"sale:"+ticket-);//这是第二句
}
把两句括起来,就可以了。(我猜你是这么想的吧)
作者:
@在路上
时间:
2014-12-4 21:52
做题眼花了 看了好半天才发现括号问题 :D
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2