黑马程序员技术交流社区

标题: 关于静态 类 成员变量 不懂,线程那一节 [打印本页]

作者: 张帅    时间: 2011-12-27 14:42
标题: 关于静态 类 成员变量 不懂,线程那一节
本帖最后由 张帅 于 2011-12-28 23:11 编辑

/*
需求:简单的卖票程序
多个窗口卖票
*/
class Ticket extends Thread{
        private static int tick = 100;   //为什么这里加了static就可以保证多个线程使用的票数是唯一的呢
        public void run(){
                while(true){
                        if(tick>0){
                                System.out.println(Thread.currentThread().getName()+" sale:"+tick--);
                        }
                }
        }
}
public class Demo{
    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();
        }
}

该贴已经同步到 张帅的微博
作者: 刘基军    时间: 2011-12-27 14:48
静态成员是类成员,只在加载该类时初始化一次,无论创建多少对象,该静态成员也只有一份。
共享数据即可使用static修饰。
作者: 张帅    时间: 2011-12-27 14:55
原来是这样,我还以为得使用单例模式才能实现这个售票呢
作者: 张帅    时间: 2011-12-27 14:55
monghuan 发表于 2011-12-27 14:48
静态成员是类成员,只在加载该类时初始化一次,无论创建多少对象,该静态成员也只有一份。
共享数据即可使 ...

原来是这样,我还以为得使用单例模式才能实现这个售票呢
作者: 刘建宇    时间: 2011-12-27 15:13
被static修饰的变量属于类,随着类的加载而加载,随着类的消亡而消亡,跟创建多少个对象是没有关系的,它在内存中只存在一份
作者: 张帅    时间: 2011-12-27 15:39
刘建宇 发表于 2011-12-27 15:13
被static修饰的变量属于类,随着类的加载而加载,随着类的消亡而消亡,跟创建多少个对象是没有关系的,它在 ...

这个知识确实迷糊了
作者: 黄战胜    时间: 2011-12-28 17:02
关键是要懂的关键字的含义,static定义的变量时共享的,为什么能共享,本质上式全局的。CPU在运行程序的时候,有一个缓冲区,经常用到的变量值会拷贝到这个缓冲区中,等运行的时候下次用到这个变量的时候,CPU就会在这个缓冲区中找数据来读就,不会再到硬盘(嵌入式中常用的是nandflash)中去读数据,这样可以提高效率,但是就会产生一个问题,读写数据不具有实时性,这时候如果定义个static修饰的话,这个缓冲区中就不会有变量的拷贝,每次都到硬盘中区读数据,这时候的的数据有具备实时性。共享的原理是内存非常的机制和全部变量。
作者: blackbansy    时间: 2011-12-28 17:55
在多线程程序中,无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可以直接访问静态成员,但是访问类的非静态函数或成员变量就必须做一个适配器,代码如下:

class CStaticThread
{
public:
        static int ThreadFunc(LPVOID pParam);/
protected:
    int ThreadFuncKernal();
}

void CStaticThread::Func()
   {
        AfxBeginThread(TreadFunc, this);
   }

   int CStaticThread::ThreadFunc(LPVOID pParam)
   {
       CStaticThread*pObj = (CStaticThread*)pParam;
       return pObj->ThreadFuncKernal();

   }

   // Thread function kernal
   int CStaticThread::ThreadFuncKernal()
   {
       while(1)
       {
           // my thread
           // to control class non-static member
       }
       return 0;
   }

网上找的答案。互相学习
作者: 张一凡    时间: 2011-12-28 22:45
嗯·     LS的都说的都不错
今天我也刚看了这个视频

作者: 颜小飞    时间: 2011-12-28 23:23
static修饰的变量在内存中始终只一份。不管多少个线程来卖。都是卖的这一份




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