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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马任雪刚 中级黑马   /  2012-5-20 09:40  /  1674 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//售票的小程序。
//并且是两个窗口同时售票。

class Ticket extends Thread
{
        private static int ti=100;//为什么这儿加上static修饰符就不是“二百张票了”?????
        Ticket()
        {
                super();
        }
        Ticket(String name)
        {
                super(name);
        }
        public void run()
        {
        while(true)
        {
                if(ti>0)
                        System.out.println(this.getName()+"run-----"+ti--);
        }
        }
}
public class Td
{

       
        public static void main(String[] args)
        {
                Ticket t=new Ticket("one++++");
                Ticket t1=new Ticket("two++++");
                t.start();
                t1.start();

        }

}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 static 这块回头复习下吧~~

查看全部评分

7 个回复

倒序浏览
private static int ti=100;//为什么这儿加上static修饰符就不是“二百张票了”?????
看了半天才明白你要说的是啥意思,被static修饰的变量存放在静态共享区,等于是一个共享的数据。所以线程在操作它时,始终是在对同一个数据进行操作。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
就像毕老师说的,静态的成员变量存在于方法区。对象没建立之前就已经存在。

也许可以这么理解,int 变量ti只有一个,就在方法区。只有一个,注意这一点。
如果不是静态,那就每个实例对象都有一个int 变量ti,两个对象就有两个。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
当一个类中定义了一个静态的成员变量后,在类加载的时候,这个静态成员变量就随着类的加载而加载到内存中的方法区中,并共享于该类的所有对象, 一个对象对该成员变量进行修改,其他对象在使用时,得到的是修改后的值。
回复 使用道具 举报
整个技术分真难,都带抢的{:soso_e153:} 说说我的看法吧
在这个例子里,票是共享资源,必须保证多条线程访问的都是同一个资源,那么,如果不把票这个属性静态化,就会出现,每开一条线程重新new 100张票,显然不合理的。当票数量这个属性被静态,那么这个属性就会存贮在静态区,成为共享资源,就实现了每条线程调用的都是同一个资源。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
private static int ti=100;//为什么这儿加上static修饰符就不是“二百张票了”?????
还要加强基础呀 关于静态变量,变量在内存的存储位置应该好好看一下 以static修饰的变量会在内存静态存储区域分配空间 成为共享资源 并且在定义时赋予初值,不能被修改

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
谢谢!!!
回复 使用道具 举报
static代码只在类首次加载时开辟一次空间,也就是说所有此类的对象共享static代码。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马