Java23种设计模式之单例模式

设计模式之单例模式


单例模式
采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其

对象实例的方法(静态)

饿汉式(静态变量) 可能造成内存浪费
优点: 比较简单,在类装载的时候就完成了实例化,避免了线程同步的问题
缺点: 在类装载的时候就完成了实例化 没有达到 lazy loading(懒加载)的效果。如果从始至终
未使用这个实例,会造成内存的浪费

public class singleton{
//构造器私有化
private singleton(){

}
//本类内部创建实例对象
private final static singleton instance=new singleton();
//提供一个共有的静态方法返回对象实例
public static singleton getInstance(){
        return instance;
}
}

饿汉式(静态代码块)


public class singleton{
//构造器私有化
private singleton(){

}
private static singleton instance;

static {
   instance=new singleton();
}
 public static singleton getInstance(){
   return instance;
}
}

懒汉式 (线程不安全)

起到了懒加载的作用 但只能在单线程下使用
如果在多线程下一个线程进入了if判断还未来得及往下执行,拎一个线程也通过
了if判断这时便会产生多个实例 ( 不推荐使用)

public class singleton{
   private static singleton instance;
   privaet singleton(){}
public static singleton getInstance(){

   if(instance==null){
    instance=new singleton();
}
 return instance;
}
}

懒汉式(线程安全) 加了synchroized 关键字
效率太低 每个线程想获得类的实例时候,执行getinstance()方法都要进行同步

public class singleton{
   private static singleton instance;
   privaet singleton(){}
public static synchroized singleton getInstance(){

   if(instance==null){
    instance=new singleton();
}
 return instance;
}
}

如果加上同步代码块 连线程安全都无法保证 多个线程进入if判断

public class singleton{
   private static singleton instance;
   privaet singleton(){}
   public static synchroized singleton getInstance(){
     if(instance==null){
      synchronized(singleton.class){
       instance=new singleton();
       }                 
     }
   }
 }

双重检查 (推荐使用)
线程安全,延迟加载,效率较高
进行了两次if判断,保证了线程安全
这样实例化代码只用执行一次,后面再次访问时,直接return实例化对象,避免反复进行方法同步

class singleton{
   private static volatile singleton instance;
   private singleton(){
   }
   public static Singleton getInstance(){
    if(instance== null){
 synchronized(Singleton.class){
   if(instance== nul){
      singleton = new Singleton();
     }
  }
}
return singleton;
 }
}

静态内部类(推荐使用)

public class singleton{
 private singleton(){
 }
 //在singleton进行类装载的时候不会马上执行,从而保证了懒加载
 private static class SingletonInstance{
    private static final singleton INSTANCE=new singleton();
}
 public static singleton getInstance(){
  //装载静态内部类    补充:在jvm装载类的时候是线程安全的
  return SingletonInstance.INSTANCE;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值