黑马程序员技术交流社区

标题: 多线程售票例子中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