黑马程序员技术交流社区
标题:
关于多线程的问题,请各位大侠帮忙分析一下,谢谢。
[打印本页]
作者:
何仕映
时间:
2013-3-6 14:38
标题:
关于多线程的问题,请各位大侠帮忙分析一下,谢谢。
class SellTicket extends Thread //买票的功能
{
private static int sum = 10; //设定票的总数
public void run() //买票的方法
{
while (sum>0)
{
try
{
sleep(100); //设定延时
}
catch (Exception e)
{
}
System.out.println(this.getName()+"卖出的票号为"+(--sum));
}
}
}
class ThreadTest__1
{
public static void main(String[] args)
{
SellTicket aa = new SellTicket();
aa.setName("售票员一");
aa.start();
SellTicket bb = new SellTicket();
bb.setName("售票员MMMMMM");
bb.start();
}
}
/*
运行结果
=================================
售票员MMMMMM卖出的票号为9
售票员一卖出的票号为8
售票员一卖出的票号为7
售票员MMMMMM卖出的票号为7
售票员一卖出的票号为6
售票员MMMMMM卖出的票号为5
售票员一卖出的票号为4
售票员MMMMMM卖出的票号为3
售票员一卖出的票号为2
售票员MMMMMM卖出的票号为1
售票员一卖出的票号为0
售票员MMMMMM卖出的票号为-1
=================================
在这个程序中我加sleep()语句是为了让这个程序暴露安全问题(打出票号为-1的票),我知道代码该如何优化,我只是没有想明白怎么会出现两张7号票呢?
,--x和打印是在一条语句里面。为什么会出现两张7号票呢?
这个结果是随机出现的,请各位大哥分析一下执行过程,谢谢。
*/
作者:
张晋瑜
时间:
2013-3-6 15:39
你这个是线程互斥问题,等下,我来修正下你的代码
作者:
张晋瑜
时间:
2013-3-6 15:41
问题在于当线程aa访问sum时,还没来得及修改sum值,线程bb就同时访问sum了
我们就不能让aa线程和bb线程同时访问sum值
可以这样修改:在你的代码中加一点点东西就可以了(
加把锁
)
public class ThreadTest__1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SellTicket aa = new SellTicket();
aa.setName("售票员一");
aa.start();
SellTicket bb = new SellTicket();
bb.setName("售票员MMMMMM");
bb.start();
}
}
class SellTicket extends Thread //买票的功能
{
private static int sum = 10; //设定票的总数
public void run() //买票的方法
{
synchronized (this) { // 在这里加个对象锁就可以了,就是说不能两个线程同时访问或者修改【sum】
while (sum>0)
{
try
{
sleep(100); //设定延时
}
catch (Exception e)
{
}
System.out.println(this.getName()+"卖出的票号为"+(--sum));
}
}
}
}
复制代码
作者:
amen0205
时间:
2013-3-6 23:37
我感觉是记得计算机疯了 是不是双核的问题,一个cpu打印 了 还没来得急把sum值修正 另一个就又打印了 应不会出现这个问题啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2