核心作用:保证一个类只有一个对象,并提供一个访问该实例的全局访问点
package xidian.lili.thread.syn;
/**
1.创建单例模式(懒汉式+双重检测锁实现)
构造器私有化 确保外部不能创建对象
创建私有静态变量,先不初始化,用的时候再初始化(资源利用率高了)
创建对外的公共静态方法(加同步,并发效率低)创建对象指向私有静态变量并返回
*/
public class MyJvm {
private static MyJvm jvm;创建私有静态变量
private MyJvm(){
构造器私有化
}
public static MyJvm getInstance3() throws InterruptedException{
//双重检查 提高效率
if(jvm==null){//如果已经有对象 线程都不在等待 没有对象在进去
synchronized(Jvm.class){//同步快 不能this对象 静态方法中没有this对象 放入类的字节码信息 效率低
if(jvm==null){
jvm=new MyJvm();
}
}
}
return jvm;
}
}
/**
饿汉式 创建单例模式
构造器私有化 确保外部不能创建对象
创建私有静态变量+创建对象(类在初始化时,就加载这个对象,JVM加载类时天然保证线程安全,不延时,但是只是加载类,不用到对象这样就会造成资源浪费)
创建对外的公共静态方法(方法不加同步 效率高)返回私有静态变量
*
*/
class MyJvm2 {
//由于是静态方法 类加载时就会创建对象 线程安全 可是效率低 没有使用该类对象就创建了 所以改进,把创建对象放在内部类中
private static MyJvm2 jvm=new MyJvm2();
private MyJvm2(){
}
public static MyJvm2 getInstance() throws InterruptedException{
return jvm;
}
}
改进:静态内部类实现兼具延迟加载和并发高效
class MyJvm3{
//加入静态内部类进行包裹
//加载了MyJvm3 不会加载MyJvmhold 只有在使用的时候 比如调用getInstance() 方法在加载创建对象
//加载类时属性会被初始化 方法不会
private static class MyJvmhold{
private static MyJvm3 jvm=new MyJvm3();
}
private MyJvm3(){
}
public synchronized static MyJvm3 getInstance() throws InterruptedException{
return MyJvmhold.jvm;
}
}
/**
在jdk里的单例设计模式Runtime 饿汉式
public class Runtime {
private static Runtime currentRuntime = new Runtime();//属性创建对象
//公开访问对象
public static Runtime getRuntime() {
return currentRuntime;
}
//构造方法私有化
private Runtime() {}
*/
避免反射漏洞 不能延迟
单例模式反射和反序列化漏洞及解决