阅读 桌面完整版
静态成员 (static) 在面向对象程序语言中就有点像全局变量的意思, 静态成员在所有的对象中都只在内存中存一份 copy, 而且不需要类实例化就能使用, 比如在C#里可以有 static class只能包含 static 的方法.
在JAVA中, 你可以把静态成员在 static 块中创建.
1 2 3 4 5 6 | public class Sample { public static Object obj; static { obj = new Object(); } } |
public class Sample { public static Object obj; static { obj = new Object(); } }
还有一种就是直接在声明变量的时候就创建, 这在 C# 里也是一样的.
1 2 3 | public class Sample { public static Object obj = new Object(); } |
public class Sample { public static Object obj = new Object(); }
如果你的全局对象并不是马上就要用, 比如一些模块开启后才会被使用, 那么, 你就可以通过 Lazy Loading 的方式推迟创建和加载.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Sample { private static Object _obj; public static Obj { get { if (_obj == null) { lock(_obj) { if (_obj == null) { _obj = new Object(); } } } return _obj; } } } |
public class Sample { private static Object _obj; public static Obj { get { if (_obj == null) { lock(_obj) { if (_obj == null) { _obj = new Object(); } } } return _obj; } } }
上面的代码中, 先定义了一个私有变量, 然后在公有的属性 get 中, 先是判断是否为 null, 如果还没被创建, 那么就锁定 (lock) 因为有可能同时多个线程会访问到这个变量, 需要进行资源锁定, 然后锁定之后由其中一个线程去创建, 然后等资源释放后, 其它线程还需要再判断是否为 null.
最外面的 if 判断就是为了加速, 因为 lock 毕竟速度慢, 当第一次创建后, 以后多个线程在读的时候就不需要再锁了.
英文同步: https://helloacm.com/static-object-global-variable-lazy-loading-in-c/
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK