黑马程序员技术交流社区
标题:
多线程售票例子中的问题
[打印本页]
作者:
黄丽慧
时间:
2012-7-3 10:20
标题:
多线程售票例子中的问题
本帖最后由 黄丽慧 于 2012-7-3 10:38 编辑
刚刚在看毕老师的多线程视频中的售票例子,四个窗口同时卖票,创建四个线程对象同时卖票如:
class ticket extends Thread
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
System.out.println(Thread.currentThread().getName()+"...sale"+tick--);
}
}
}
public class ticketDemo
{
public static void main(String[] args)
{
ticket t1=new ticket();
ticket t2=new ticket();
ticket t3=new ticket();
ticket t4=new ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//上面程序的运行结果是四个窗口同时各卖1-99号,这样就会出现重号,这是不符合事实的。
当把tick变量定义成static类型时,运行的结果就是正确的。
我的问题是:为什么把tick变量定义成static类型时这个问题就能解决了呢?是不是当tick定义成static类型时,tick变量存放在方法区,每个线程对象创建后,并不是各自在创建一个tick变量,而是调用方法区内的同一个变量——即该tick变量啊。。
作者:
杨_扬
时间:
2012-7-3 10:22
你说的没错
方法区中的变量,即静态变量,被所有线程共享
作者:
车风波
时间:
2012-7-3 10:26
static修饰的变量在静态区 只存在一个,无论是通过对象名.变量名 还是类名.变量名调用都是调用这一个,而不是new 一个就创建一个新的变量。
作者:
张扬123
时间:
2012-7-3 10:28
我也不写什么代码了,用大白话跟你说吧,不加静态,每个窗口都有100张票,卖票会出现重号。但是加了Static之后,相当于四个窗口共享或者共用这100张票,总共票数只有100张,不会出现问题。这是静态的特点之一。不知道这样说楼主明白不。
作者:
黄丽慧
时间:
2012-7-3 10:39
嗯,好的,我知道了
作者:
刘建龙
时间:
2012-7-3 15:48
首先呢,创建对象时,类中的成员变量就要被分配空间到堆内存中,如果创建4个对象,就等于在堆内存中给4个tick赋值了,所以必然每个窗口都会售出100整票。当tick加上static以后就存放在方法区中的静态区了,变量被共享,四个对象都可以改变tick的值,并且tick只有一个。分清静态变量和非静态变量在内存中的储存位置不同才是关键。
作者:
葛奎
时间:
2012-7-3 17:14
首先:静态变量的特点:
它是随着类的加载然后自然就到了内存中(共享数据区) 不需要创建对象的时候它就已经到内存中去了
而当各个对象创建之后,当他们用到这个变量时候 直接调用共享数据区的该变量就行了 也就是说多个对象共用这一个静态变量
票数要定义成static类型的 private static ticket=100;
它作为共享数据,不能写成局部变量
这样多个对象就可以操作同个资源了,不会发生多人买到同一张票的情况.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2