五种单例模式实现懒汉+饿汉+双重检测锁实现+静态内部类改进饿汉式+枚举

核心作用:保证一个类只有一个对象,并提供一个访问该实例的全局访问点

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() {}
*/

避免反射漏洞 不能延迟

单例模式反射和反序列化漏洞及解决

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值