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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张帅 黑马帝   /  2011-12-27 14:42  /  3156 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张帅 于 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();
        }
}

该贴已经同步到 张帅的微博

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

9 个回复

倒序浏览
静态成员是类成员,只在加载该类时初始化一次,无论创建多少对象,该静态成员也只有一份。
共享数据即可使用static修饰。

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
张帅 黑马帝 2011-12-27 14:55:00
藤椅
原来是这样,我还以为得使用单例模式才能实现这个售票呢
回复 使用道具 举报
张帅 黑马帝 2011-12-27 14:55:17
板凳
monghuan 发表于 2011-12-27 14:48
静态成员是类成员,只在加载该类时初始化一次,无论创建多少对象,该静态成员也只有一份。
共享数据即可使 ...

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

这个知识确实迷糊了
回复 使用道具 举报
黄战胜 黑马帝 2011-12-28 17:02:11
7#
关键是要懂的关键字的含义,static定义的变量时共享的,为什么能共享,本质上式全局的。CPU在运行程序的时候,有一个缓冲区,经常用到的变量值会拷贝到这个缓冲区中,等运行的时候下次用到这个变量的时候,CPU就会在这个缓冲区中找数据来读就,不会再到硬盘(嵌入式中常用的是nandflash)中去读数据,这样可以提高效率,但是就会产生一个问题,读写数据不具有实时性,这时候如果定义个static修饰的话,这个缓冲区中就不会有变量的拷贝,每次都到硬盘中区读数据,这时候的的数据有具备实时性。共享的原理是内存非常的机制和全部变量。

点评

回答的最好,连机制都说的很清楚  发表于 2011-12-28 22:56

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
blackbansy 黑马帝 2011-12-28 17:55:51
8#
在多线程程序中,无论我们使用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:58
9#
嗯·     LS的都说的都不错
今天我也刚看了这个视频

点评

我都忘了  发表于 2011-12-29 00:41
回复 使用道具 举报
颜小飞 黑马帝 2011-12-28 23:23:20
10#
static修饰的变量在内存中始终只一份。不管多少个线程来卖。都是卖的这一份

点评

对的  发表于 2011-12-29 00:41
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马