单例模式三种创建模式:
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;
}
}