Static的使用

用static要关心的问题就是生命周期 和 在什么时候使用。

 

曾经我问过这样一个问题:
有个弱弱的问题,我总是不明白?
服务器是给每个用户都创建一个静态方法还是多用户都共享一个静态方法?

得到的回答:BigPotato
服务器会产生一个新的线程相应调用,
每个线程都会有自己的堆栈,用以保存方法的局部变量。所以相互之间不会有影响。
如果静态方法会去修改全局变量或静态变量的话就有问题了

我: 15:13:37
虽然服务器给不同线程的形参创建单独的存储,但是最后返回结果呢,方法的返回结果还是单独??如果是单独的就没问题了,呵呵

 

BigPotato 15:18:57
返回值也是在线程的堆栈中的,赋值时拷贝到其他的变量

 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

然后我又看到了CSDN的一个静态方法并发问题的帖子:

各位大侠,有个问题困扰我好久了.
有如下方法
public static string Test(int a)
{
    .....
    if(a=XX){
    ....
    }

    ....

    a = XX;

    .....

    return OOO;
}

如果在两个用户同时并发执行的情况下,有没有可能出现以下这种情况:
当A用户执行到一半时,B用户进入此静态方法,然后将此方法中的前一半变量的值都改了.最终造成A用户得出的结果不正确.

有可能会发生吗?对了,不想用LOCK,因为LOCK一般多线程时我才会用,如果会出现两种结果,那只有取消静态了.

有人回答:
你怎么又跑着来问这个问题,我已经给你回复了

如果你的Test方法里没有使用静态变量是不会的,因为Test方法的参数,临时变量都在自己的线程栈里保存,线程之间是看不见的。只有堆上的数据才能被统一进程内的线程共享。所以不会出现你所的这种情况

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

我从百度抄下这一段话,帮助大家理解:
 (非静态方法是相对于静态方法来说的。静态方法使用static关键字来标示,非静态方法没有此关键字。
他们之间最大的区别在于它们生命周期的不同,静态方法属于全局方法,当静态方法第一次被访问的时候,就将常驻内存直到整个系统被销毁;而非静态方法则与类有关,只有该方法所在的类被实例化之后,该方法才能被访问,类被销毁的同时方法也被销毁。生命周期的不同决定了它们的调用方式的不同,静态方法使用(类名.方法名)来调用,而非静态方法则需要(new 类名().方法名)来调用。
同时与之相关的就是,静态方法不能调用非静态方法和属性。在了解了它们生命周期的不同后,这一点也比较好理解,因为静态方法生命周期比非静态方法和属性长,当调用非静态方法和属性时就会产生非静态方法和属性已经被销毁的情况导致程序出错。)

 

我个人认为,使用static的原则是:凡是不应该属于某个实例对象的变量、方法都应该设置为static。

1、static变量。
 使用static变量,可以跳过对象的实例化过程,可以降低开销,对于一些经常使用的变量其效果更为显著,但是因为static的生命周期比较长,在内存中长期占据
 着一个空间,所以说这是典型的用空间换时间的做法。
 
1.1 有特殊含义并且不止用于一个类中的常量。
 如某个常量0代表的"机器故障"、1代表是"机器正常",再某个实例方法中进行机器检测后需要返回检测结果,这时可以设置一个常量类Constant,定义两个常量
 public final static int MACHINE_NOWORK = 0;
 public final static int MACHINE_WORK = 1;
 当浏览代码时,就很容易从变量字面判断0,1的意思。这样以后对返回结果分析时,也可以不用理会0,1是什么意思,只要判断返回值,如
 int resutl = method() //public int method() {....return Constant.MACHINE_NOWORK; | return Constant.MACHINE_WORK;}
 直接通过result和Constant常量比较就可以了。如if(result == Constant.MACHINE_WORK) {...}
 这样感觉是不是好很多呢。

 

1.2


 
2 static方法(参考上面的议论)

3 static类。略。

 

没写的以后有空补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值