单例模式静态内部类实现线程安全。
2016-06-07 15:37
399 查看
模拟单例的类
package singleton.test; public class MyObject { private MyObject() { // TODO Auto-generated constructor stub } static { System.out.println("XXXX"); } /** * 内部类实现单例模式 * * @author cindy * */ private static class MyObjectHandle { private static MyObject myObject = new MyObject(); static { System.out.println("1234"); } } public static MyObject getInstance() { return MyObjectHandle.myObject; } public static void display() { //测试静态代码块是否加载 System.out.println("ldjfdfasdfdsfdsff"); } }
测试类
package singleton.test; public class SingletonTest { public SingletonTest() { // TODO Auto-generated constructor stub } static class Mythread extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); System.out.println("Singleton hashcode" + MyObject.getInstance()); } } public static void main(String[] args) { Mythread mythread1 = new Mythread(); Mythread mythread2 = new Mythread(); Mythread mythread3 = new Mythread(); // mythread1.start(); //@1 // mythread2.start(); // mythread3.start(); //@2 MyObject myObject = null; myObject.display(); } }
如果将1和2出的代码都注释掉,输出结果是如图。说明静态内部类以及MyObject类都没有加载,如果加载那么静态代码块一定执行。
将2段代码执行
输出结果是,说明MyObject静态代码块执行了,也就说明MyObject类加载到JVM了但是静态内部类还没有加载到虚拟机。
将1段代码执行看到哈希码值是一样的。说明是单例模式。同时只有getInstance方法执行后静态内部类才加载到JVM中。也是一种延时加载的实现方法。
Java机制规定,内部类 MyObjectHandle只有在getInstance()方法第一次调用的时候才会被加载(实现了延迟加载效果),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance。
相关文章推荐
- 获取CurrentClass的所有SuperClass和接口
- 补充程序之游戏系列— 1游戏中的角色类 (2)
- 竖直滑动View制作引导页
- arm汇编中ldr指令中出现的等号作用
- (Android)线程池
- iOS巅峰之摇一摇功能的实现
- ubuntu修改host
- 图像的变换模型
- scrollview拦截子控件的滑动
- 如何检测鼠标/触摸点碰到某个collider2D?
- iOS中常见的6种传值方式,UIPageViewController
- python itertools模块指南
- APK加固
- ERP升级实施分布整理
- Spring容器初始化过程
- jQuery 如何先创建、再修改、后添加DOM元素
- TortoiseGit和Git操作git@osc简要说明
- JRDB:iOS对FMDB的超好用封装
- Android 动画 - AnimationSet 动画集合使用(附图)
- 动态加载so库文件