黑马程序员技术交流社区
标题:
多线程售票例子中static的应用求解
[打印本页]
作者:
王利强
时间:
2012-3-14 12:10
标题:
多线程售票例子中static的应用求解
tick不用static修饰时,四个线程输出的数字出现重复,会出现四个线程均售出同一张票的后果。但在tick前加上static定义之后,四个线程输出的数据不重复,是因为static修饰后tick是全局变量的原因么,能不能再帮我深入解释下,有点不太理解。
class Ticket extends Thread
{ private static int tick=100;
public void run()
{
while(tick>0)
System.out.println(currentThread().getName()+"...."+tick--);
}
}
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();
}
}
作者:
王杰
时间:
2012-3-14 12:16
将tick静态以后就成为共享数据了。你的代码没有写完吧。应该给run里的代码加一个锁
作者:
许圣建
时间:
2012-3-14 12:21
静态数据存放在共享区,你所创建的四个new Ticket()对象共享这一个类成员,这个成员并不是因为你创建对象而产生的,而是在这个类第一次加载时就已经加载了,
即使你不创建对象也可以使用这个变量Ticket.tick,既然只有一份数据存在,那么四个对象访问这个资源也就无法重复了(线程安全时)。
作者:
崔岩
时间:
2012-3-14 12:34
你的TICKET是在Thread里定义的,如果没有声明为静态,则没new一个thread,都会开辟一个新的局部变量ticket。总共有四个ticket,是互相独立的。
而声明为静态以后,这个ticket就不是运行时候开辟的空间了,而是在编译时候就生成了一个ticket。当你new四个thread时,每个thread里的ticket都指向编译时产生的那个全局的ticket,是同一内存地址。
作者:
吴璞玉
时间:
2012-3-14 12:44
如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共同拥有一个static变量。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2