单例模式静态内部类实现线程安全。
来源:互联网 发布:java xml 字节点 编辑:程序博客网 时间:2024/05/18 21:39
模拟单例的类
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。
0 0
- 单例模式静态内部类实现线程安全。
- 单例模式-静态内部类的实现(线程安全)
- 单例模式--理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 线程安全单例模式之静态内部类
- 【Java】线程安全的单例模式----静态内部类
- 静态内部类实现单例模式
- Java单例模式——静态内部类实现
- 使用静态内部类实现延迟加载单例模式
- 静态内部类实现单例设计模式
- 利用静态内部类实现的单例模式
- 单例模式之静态内部类实现
- 使用静态内部类实现单例模式
- 静态内部类实现方式 , 单例模式类
- 竖直滑动View制作引导页
- 如何检测鼠标/触摸点碰到某个collider2D?
- arm汇编中ldr指令中出现的等号作用
- RESTful API 设计指南
- javascript DOM编程学习心得之基础
- 单例模式静态内部类实现线程安全。
- Eclipse中的引用项目报Could not find *.apk!解决办法
- UVA 10943 (DP 水~)
- 【MyBatis学习05】SqlMapConfig.xml文件中的配置总结
- VLAD
- ListView内部调用了requestDisallowInterceptTouchEvent(true)
- Linux Error: curses.h: No such file or directory
- 关于mFirstTouchTarget
- 出路体会