单例模式之:高效非同步方法实现
来源:互联网 发布:ios屏蔽广告软件 编辑:程序博客网 时间:2024/06/06 19:12
加载一个类时,其内部类是否同时被加载?下面我们做一个实验来看一下。
运行结果:
load outer class...
==========分割线==========
load static inner class...
static inner method...
调用构造方法时,外部类Outer被加载,但这时其静态内部类StaticInner却未被加载。直到调用该内部类的静态方法(在分割线以下),StaticInner才被加载。可以做类似的实验验证非静态内部类的情况。
结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
根据内部类不会在其外部类被加载的同时被加载的事实,我们可以引申出单例模式的一种实现方式:
该实现方式比较简单,而且既实现了由前述事实所保证的惰性初始化(Lazy-Initialazation),又由JVM保证了多线程并发访问的正确性。
- public class Outer {
- static {
- System.out.println("load outer class...");
- }
- //静态内部类
- static class StaticInner {
- static {
- System.out.println("load static inner class...");
- }
- static void staticInnerMethod() {
- System.out.println("static inner method...");
- }
- }
- public static void main(String[] args) {
- Outer outer = new Outer(); //此刻其内部类是否也会被加载?
- System.out.println("===========分割线===========");
- Outer.StaticInner.staticInnerMethod(); //调用内部类的静态方法
- }
- }
运行结果:
load outer class...
==========分割线==========
load static inner class...
static inner method...
调用构造方法时,外部类Outer被加载,但这时其静态内部类StaticInner却未被加载。直到调用该内部类的静态方法(在分割线以下),StaticInner才被加载。可以做类似的实验验证非静态内部类的情况。
结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
根据内部类不会在其外部类被加载的同时被加载的事实,我们可以引申出单例模式的一种实现方式:
- public class Singleton {
- private Singleton() {}
- static class SingletonHolder {
- private static final Singleton instance = new Singleton();
- }
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
- }
该实现方式比较简单,而且既实现了由前述事实所保证的惰性初始化(Lazy-Initialazation),又由JVM保证了多线程并发访问的正确性。
阅读全文
0 0
- 单例模式之:高效非同步方法实现
- 单例模式实现方法
- 单例模式实现方法
- C++(Singleton)更高效单例模式实现
- 程序设计之 同步静态方法和单例模式的选择
- 关于单例模式中线程同步的方法(同步块和同步方法)
- 单例模式 模板类和非模板类实现
- 单例模式的实现(ARC与非ARC)
- oc非ARC机制实现单例模式
- 单例模式的一种实现方法
- 单例模式几种实现方法
- 单例模式的一种实现方法
- 单例模式c++实现方法总结
- 单例模式的另一种实现方法
- C++中实现单例模式方法
- java 单例模式 几个实现方法
- java单例模式实现方法
- 单例模式几种实现方法
- 从vue文件中抽取出子组件的流程及过程中踩过的坑
- Opencv绘制灰度/彩色图像的直方图及直方图的均衡化实例及源代码
- 蓝牙模块调试笔记
- 51nod 1580 铺管道
- Android 创建自定义控件
- 单例模式之:高效非同步方法实现
- 克隆创建PDB--(1)本地克隆创建PDB
- Add to List 442. Find All Duplicates in an Array(java)
- win7下IIS配置以及域名映射方法
- Python-元类
- codeforces 271A(Beautiful Year) Java
- MongoDB详细介绍
- JDBC的业务逻辑流程和模块开发的原理分析
- Java基础的编程:9*9乘法表、质数的寻找、scanner的使用和迭代的基础