单例模式

单例模式的作用或者优点

单例模式可以保证使用该模式的类在系统中永远只有一个实例,避免多个实例存在引起的逻辑错误。

单例模式的六种实现方式

按创建单例的时机,又可以分为在类初始化的时候创建和按需延时创建

a.在类初始化的时候创建

1.饿汉式,线程安全

public class Singleton {

    //饿汉式

    private static Singleton singleton = new Singleton();

    private Singleton(){}

    public static Singleton getSingleton(){

        return singleton;

    }

}

2.枚举,线程安全

public enum Singleton{

   INSTANCE

}


b.按需延时创建

3.懒汉式,多个线程调用getSingleton,可能创建多个单例,线程不安全

public class Singleton{

    //懒汉式

    private static Singleton singleton = null;

    private Singleton(){}

    public static Singleton getSingleton(){

        if(singleton == null){

            singleton = new Singleton();

        }

        return  singleton;

    }

}


4.同步锁(懒汉式的改进),缺点是每次获取单例都需要进行同步,造成不必要的开销,实际上只需要在第一次创建的时候进行同步,以后直接返回单例

public class Singleton{

    //懒汉式同步锁1

    private static Singleton singleton = null;

    private Singleton(){}

    public static synchronized Singleton getSingleton(){

        if(singleton == null){

            singleton = new Singleton();

        }

        return  singleton;

    }

}


public class Singleton{

    //懒汉式同步锁2

    private static Singleton singleton = null;

    private Singleton(){}

    public static Singleton getSingleton(){

        synchronized (Singleton.class) {

            if (singleton == null) {

                singleton = new Singleton();

            }

        }

        return  singleton;

    }

}


5.双重校验锁(懒汉式的改进),缺点是实现复杂

public class Singleton{

    //懒汉式双重校验锁

    private static Singleton singleton = null;

    private Singleton(){}

    public static Singleton getSingleton(){

        if(singleton == null) {

            synchronized (Singleton.class) {

                if (singleton == null) {

                    singleton = new Singleton();

                }

            }

        }

        return  singleton;

    }

}


6.静态内部类,线程安全,在调用getSingleton()时,静态内部类Singleton2初始化,从而初始化静态变量Singleton

public class Singleton{

    //静态内部类

    private static class Singleton2{

        private static Singleton singleton = new Singleton();

    }

    private Singleton(){}

    public static Singleton getSingleton(){

        return Singleton2.singleton; 

    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值