A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王利强 中级黑马   /  2012-3-14 12:10  /  1996 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
        }
}

4 个回复

倒序浏览
将tick静态以后就成为共享数据了。你的代码没有写完吧。应该给run里的代码加一个锁
回复 使用道具 举报
静态数据存放在共享区,你所创建的四个new Ticket()对象共享这一个类成员,这个成员并不是因为你创建对象而产生的,而是在这个类第一次加载时就已经加载了,
即使你不创建对象也可以使用这个变量Ticket.tick,既然只有一份数据存在,那么四个对象访问这个资源也就无法重复了(线程安全时)。
回复 使用道具 举报
你的TICKET是在Thread里定义的,如果没有声明为静态,则没new一个thread,都会开辟一个新的局部变量ticket。总共有四个ticket,是互相独立的。
而声明为静态以后,这个ticket就不是运行时候开辟的空间了,而是在编译时候就生成了一个ticket。当你new四个thread时,每个thread里的ticket都指向编译时产生的那个全局的ticket,是同一内存地址。
回复 使用道具 举报
如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共同拥有一个static变量。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马