jvm 2015-01-31
单例模式三种创建模式:
1 饿汉式 ---> 双重判空机制
双重判空: 第一次初始化对象时在并发下防止重复创建对象,
第二个判空是为后来者提供快速得到初始化实例的切口,
防止每次获取实例都持有synchroinzed
2 饿汉式 ----> 交给JVM操作,在类被加载到时就初始化好
3 延迟加载 ----> 锁交给JVM操作,但是是在真正使用到实例的时候 才让JVM给实例化好:
4 代码:
/** * 单例创建的方式 * 1、懒汉式 * 1)、构造器私有化 * 2)、声明私有的静态属性 * 3)、对外提供访问属性的静态方法,确保该对象存在 * * @author Administrator * */ public class MyJvm { private static MyJvm instance; private MyJvm(){ } public static MyJvm getInstance (){ if(null==instance){ //提供效率 ---> 为后来线程做准备,当前面线程已经创建好了对象后,后来线程不需要直接在进入19行进入等待队列,直接在18行转变行动方向得到instance即可 synchronized(MyJvm.class){ if(null==instance){ //安全 ---> 为第一次同时的拍的等待分配CPU进入锁对象时,第一个线程释放锁后,第二个线程得到进入时需要一个判空 instance =new MyJvm(); } } } return instance; } } /** * 饿汉式 1)、构造器私有化 * 2)、声明私有的静态属性,同时创建该对象 * 3)、对外提供访问属性的静态方法 * @author Administrator * */ class MyJvm2 { private static MyJvm2 instance =new MyJvm2(); // static资源在JVM加载类时就已经初始化好了,即加锁任务交给了JVM 因此不再需要synchronized private MyJvm2(){ } public static MyJvm2 getInstance (){ return instance; } } /** * 类在使用的时候加载 ,延缓加载时间 同样将锁交给JVM实现(static关键词是提醒) * @author Administrator * */ class MyJvm3 { private static class JVMholder{ private static MyJvm3 instance =new MyJvm3(); } private MyJvm3(){ } public static MyJvm3 getInstance (){ return JVMholder.instance; } }