黑马程序员技术交流社区
标题:
请教问题:关于多线程访问静态变量的问题。[已解决]
[打印本页]
作者:
李征雪
时间:
2012-4-5 09:26
标题:
请教问题:关于多线程访问静态变量的问题。[已解决]
本帖最后由 李征雪 于 2012-4-6 08:01 编辑
毕老师第11天视频中卖票的程序
class Ticket extends Thread
{
public static int tick = 100;//定义一个共享的票数;
Ticket(String name)
{
super(name);
}
public void run()
{
while(tick > 0)
{
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
tick--;//每次减一张票
}
}
}
class Demo1107
{
public static void main(String[] args)
{
Ticket t1 = new Ticket("tttt");
Ticket t2 = new Ticket("xxxx");
t1.start();
t2.start();
System.out.println("Hello World!");
}
}
复制代码
运行结果:
Demo1107.jpg
(13.05 KB, 下载次数: 60)
下载附件
2012-4-5 09:22 上传
为什么我的第100张票卖了两次?
其它的都是次,是不是哪写错了?
作者:
yangshang1
时间:
2012-4-5 09:56
class Ticket implements Runnable
{
public static int tick = 100;//定义一个共享的票数;
public void run()
{
while(tick > 0)
{
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
tick--;//每次减一张票
}
}
}
public class Demo1107
{
public static void main(String[] args)
{
// Ticket t1 = new Ticket("tttt");
// Ticket t2 = new Ticket("xxxx");
Thread t1=new Thread(new Ticket());
Thread t2=new Thread(new Ticket());
t1.start();
t2.start();
System.out.println("Hello World!");
}
}
这样就可以了
作者:
yangshang1
时间:
2012-4-5 10:00
你那是线程同步了
作者:
yangshang1
时间:
2012-4-5 10:01
class Ticket extends Thread
{
public static int tick = 100;//定义一个共享的票数;
public Ticket(String name)
{
super(name);
}
public void run()
{
while(tick > 0)
{
synchronized(Ticket.class)
{
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
tick--;//每次减一张票
}
}
}
}
public class Demo1107
{
public static void main(String[] args)
{
Ticket t1 = new Ticket("tttt");
Ticket t2 = new Ticket("xxxx");
// Thread t1=new Thread(new Ticket());
//Thread t2=new Thread(new Ticket());
t1.start();
t2.start();
System.out.println("Hello World!");
}
}
作者:
李征雪
时间:
2012-4-5 12:09
我这运行还是不对啊,这个是不是和双核处理器有关啊,先去看视频,看看以后有没有这个的解决办法。
作者:
葛尧
时间:
2012-4-5 17:33
没关系,往下面看吧,要用同步解决的
作者:
孙利川
时间:
2012-4-5 19:18
这需要用到线程同步,如下:
{
public static int tick = 100;//定义一个共享的票数;
Ticket(String name)
{
super(name);
}
public void run()
{
synchronized(Ticket.class)
{
while(tick > 0)
{
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
tick--;//每次减一张票
}
}
}
}
class Demo1107
{
public static void main(String[] args)
{
Ticket t1 = new Ticket("tttt");
Ticket t2 = new Ticket("xxxx");
t1.start();
t2.start();
System.out.println("Hello World!");
}
}
作者:
吴玉辉
时间:
2012-4-5 21:10
class Ticket extends Thread
{
public static int tick = 100;//定义一个共享的票数;
Ticket(String name)
{
super(name);
}
public void run()
{
while(tick > 0)
{
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
/*
线程启动后,t1线程执行到这段代码后停止,而此时cpu执行权交给了t2线程也执行完以上
代码,此时共享数据tick并未自减,所以会打印出两张100的票。
同理,打印出两张任意大于零的同数票都有可能,由于线程的执行权是由cpu交赋的,
甚至会出现一张为1,一张为0。
*/
tick--;//每次减一张票
}
}
}
class Demo1107
{
public static void main(String[] args)
{
Ticket t1 = new Ticket("tttt");
Ticket t2 = new Ticket("xxxx");
t1.start();
t2.start();
System.out.println("Hello World!");
}
}
作者:
niceBoy
时间:
2012-4-5 23:26
楼上正解,哈哈
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
/*
线程启动后,t1线程执行到这段代码后停止,而此时cpu执行权交给了t2线程也执行完以上
代码,此时共享数据tick并未自减,所以会打印出两张100的票。
同理,打印出两张任意大于零的同数票都有可能,由于线程的执行权是由cpu交赋的,
甚至会出现一张为1,一张为0。
*/
作者:
李征雪
时间:
2012-4-6 08:02
public synchronized void show()//建立同步函数;
{
if (tick > 0)
{
System.out.println(Thread.currentThread().getName()+"---"+tick--);
}
}
复制代码
今天早上又写了一下,建立了一个同步函数,解决了,谢谢大家。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2