java单例模式

单例模式是设计模式的一种。

设计模式:设计模式是一种思想,是一种编程思想,是一套被反复使用的、多数人知晓的代码设计经验的总结。

单例模式概念:在做某个项目中,创建了一个类,无论使用该类方法多少次,都只产生一个该类对象。

单例模式有多种实现方式分别是:饿汉式,懒汉式,静态内部类,枚举。

一.饿汉式

饿汉式:只要类一加载就会创建了对象,类加载时会直接实例化对象,以后都会返回该对象的引用。

实现步骤:

1:构造函数私有化

2:提供一个静态对象属性用来接收对象

3:创建一个静态方法用来获取对象实例

举例代码如下

public class Single{

private Single(){}

private static Single single = new Single();

public static Single getInstance(){

return single;

}

}

饿汉式的优点:没有加锁,执行效率高,线程安全的实例。

饿汉式的缺点:类加载时,不管有没有用到该对象,都会直接实例化单例对象,浪费内存。

二.懒汉式

懒汉式:在调用创建对象实例的方法时才会创建对象,不会随着类的加载而加载

实现步骤:

1.构造方法需要私有化
2.提供一个静态属性
3.提供一个方法用来创建对象

举例代码如下:

public class Single{

private Single(){}

private static Single single;

public static Single getInstance(){

if (single == null){

synchronized(Single .class){

if (single == null){

single = new new Single();
}
}
}

return single;
}

}

本段代码中有双重检验,首先判断实例是否为null,为null则使用synchronized锁住类,然后在同步块中,再一次判断实例是否为null,为null则初始化实例对象。

懒汉式的优点:只有在用到对象时,才会创建对象,不会浪费内存。
缺点:单线程情况下,是安全的,但是在多线程下,多个线程可能同时执行singleton == null

三.静态内部类

通过静态内部类,完成单例模式的创建,在外部类加载时,并不会加载内部类,也就是不会实行new ()实例化,这属于懒加载,只有第一次调用getInstance方法时才会加载。

举例代码如下:

public class InnerSingleton{

private InnerSingleton(){}

private static class Inner{
private  static InnerSingleton instance =new InnerSingleton();

}
public static InnerSingleton getInstance(){
return Inner.instance;
}
}

四.通过枚举创建单例模式

枚举常用于类的对象有有限个、确定的类。比如说,星期的定义,当需要定义一组常量时,强烈建议使用枚举类。

单例使用的范围也非常的广,如果说mybatis对象的创建等。这里我们主要演示,用枚举创建单例模式的过程。

public class Single {
  private Single(){

        }
        private static enum Singleton{
            INSTANCE;
            private Single es=new Single();
        }
        public static Single getInstance(){
            return Singleton.INSTANCE.es;
        }
    }

因为枚举的性质,INSTANCE 又是由final static 修饰的,所以我们用enum来创建单例。而JVM来管理这个实例,又保证了线程安全,所以通过enum来创建单例对象是可行的。

以上就是创建单例模式的四种方式,若有不足,烦请补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值