设计模型之单例设计
创始人
2024-03-16 17:05:53

前言

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:1.单例类只能有一个类。2单例类必须创建自己的唯一id.

  • 3、单例类必须给所有其他对象提供这一实例。

单例模式的实现

单例设计模式分为两种:

饿汉式:类加载就会导致该单实例对象被创建。

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会被创建。

饿汉式实现方式一:静态变量方式

public class Singleton {//私有构造方法private Singleton(){}//2.在本类中创建本类对象private static  Singleton instance=new Singleton();//3.提供一个公共的访问方法,让外界获取该对象public static Singleton getInstance(){return instance;}
}
public class Main {public static void main(String[] args) {//创建Singleton类的对象Singleton instance= Singleton.getInstance();Singleton instance1= Singleton.getInstance();System.out.println(instance==instance1);}
}

 饿汉式实现方式二:静态代码块

public class Singleton {//1.私有构造方法,防止被外界创建private Singleton(){};//声明Singleton类型的变量private  static  Singleton instance;//null//在静态代码块中进行赋值static {instance=new Singleton();}//对外界提供获取该类对象的方法public static Singleton getInstance(){return instance;}}
public class Main {public static void main(String[] args) {//创建Singleton类的对象Singleton instance= Singleton.getInstance();Singleton instance1= Singleton.getInstance();System.out.println(instance==instance1);}
}

 

  饿汉式实现方式三:枚举

public enum Singleton {INSTANCE;
}
public class Main {public static void main(String[] args) {//创建Singleton类的对象Singleton instance= Singleton.INSTANCE;Singleton instance1= Singleton.INSTANCE;System.out.println(instance==instance1);}}

 

懒汉式实现方法一:(线程不安全)

public class Singleton {//1.私有构造方法,防止被外界创建private Singleton(){};//声明Singleton类型的变量,并没有进行赋值private  static Singleton instance;//null//对外界提供获取该类对象的方法public static Singleton getInstance(){if(instance==null){instance=new Singleton();}return instance;}}

但是这种方法在多线程里是不安全的,当有两个线程时,一个线程执行到判断语句判断instance是否为null时,处于等待状态,而另一个线程获得CPU的执行权,也会进行判断里面,这时会创建两个Singleton对象。

懒汉式实现方法二:加入synchronized 

public class Singleton {//1.私有构造方法,防止被外界创建private Singleton(){};//声明Singleton类型的变量,并没有进行赋值private  static Singleton instance;//null//对外界提供获取该类对象的方法public static synchronized Singleton getInstance(){if(instance==null){instance=new Singleton();}return instance;}}

 懒汉式实现方法三:双重检查方式

public class Singleton {//1.私有构造方法,防止被外界创建private Singleton(){};//声明Singleton类型的变量,并没有进行赋值private  static Singleton instance;//null//对外界提供获取该类对象的方法public static Singleton getInstance(){//第一次判断,如果instance的值不为null,不需要抢占锁,直接返回对象if(instance==null){synchronized (Singleton.class){//第二次判断if(instance==null){instance=new Singleton();}}}return instance;}
}

双重检查锁模式的优缺点:缺点:可能会出现空指针问题。解决方法:使用volatile关键字。 volatile保证可见性和有序性。

 懒汉式实现方法四:静态内部类方式

public class Singleton {//1.私有构造方法,防止被外界创建private Singleton(){};//定义一个静态内部类private  static class SingletonHolder{//在内部类中声明并初始化内部类的对象private  static final Singleton INSTANCE=new Singleton();}//对外界提供获取该类对象的方法public static Singleton getInstance(){return SingletonHolder.INSTANCE;}
}

 静态内部类是一种优秀的单例模式,比较常用,在没有加锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间的浪费。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...