黑马程序员技术交流社区

标题: 关于多线程的问题。。。。。 [打印本页]

作者: 黑马任雪刚    时间: 2012-5-20 09:40
标题: 关于多线程的问题。。。。。
//售票的小程序。
//并且是两个窗口同时售票。

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

        }

}

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

作者: 李哲    时间: 2012-5-20 09:48
就像毕老师说的,静态的成员变量存在于方法区。对象没建立之前就已经存在。

也许可以这么理解,int 变量ti只有一个,就在方法区。只有一个,注意这一点。
如果不是静态,那就每个实例对象都有一个int 变量ti,两个对象就有两个。
作者: 魏涞    时间: 2012-5-20 09:59
当一个类中定义了一个静态的成员变量后,在类加载的时候,这个静态成员变量就随着类的加载而加载到内存中的方法区中,并共享于该类的所有对象, 一个对象对该成员变量进行修改,其他对象在使用时,得到的是修改后的值。
作者: 秦晓阳    时间: 2012-5-20 10:30
整个技术分真难,都带抢的{:soso_e153:} 说说我的看法吧
在这个例子里,票是共享资源,必须保证多条线程访问的都是同一个资源,那么,如果不把票这个属性静态化,就会出现,每开一条线程重新new 100张票,显然不合理的。当票数量这个属性被静态,那么这个属性就会存贮在静态区,成为共享资源,就实现了每条线程调用的都是同一个资源。
作者: 麦田守望者0812    时间: 2012-5-20 10:37
private static int ti=100;//为什么这儿加上static修饰符就不是“二百张票了”?????
还要加强基础呀 关于静态变量,变量在内存的存储位置应该好好看一下 以static修饰的变量会在内存静态存储区域分配空间 成为共享资源 并且在定义时赋予初值,不能被修改

作者: 黑马任雪刚    时间: 2012-5-20 16:07
谢谢!!!
作者: niceBoy    时间: 2012-5-20 22:23
static代码只在类首次加载时开辟一次空间,也就是说所有此类的对象共享static代码。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2