Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3647870
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Java

2020-05-11 17:20:45

1. 懒汉单例模式

线程不安全的单例模式。

 public class Singleton {  

    private Singleton() {}  

    private static Singleton single=null;  

    public static Singleton getInstance() {  

         if (single == null) {    

             single = new Singleton();  

         }    

        return single;  

    }  

}

Singleton通过将构造方法限定为private避免了其他类通过访问构造器进行实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过静态的getInstance()方法进行访问。但在并发的情况下是可能出现这种情况,就是a线程先进入getInstance()方法在创建实例化的时候,也就是还没创建成功,b线程也进入了getInstance()方法,这个时候a线程实例还没建成功,b线程判断single为空也开始创建实例,导致会出现创建出两个实例来。

 

2. synchronized 修饰的懒汉单例模式

但并发的时候也只能一个一个排队进行getInstance()方法访问。

 

public static synchronized Singleton getInstance() {  

    if (single == null) {    

        single = new Singleton();  

    }    

    return single;  

}

3. 双重检查锁定的单例模式

在并发量高的情况下,不需要排队访问getInstance()方法,性能上会优于synchronized 修饰的懒汉单例模式。

 

public static Singleton getInstance() {  

        if (singleton == null) {    

            synchronized (Singleton.class) {    

               if (singleton == null) {    

                  singleton = new Singleton();   

               }    

            }    

        }    

        return singleton;   

    }

4. 静态内部类实现单例模式

静态内部类实现单例模式,这种方式优于上的方式,它即实现了线程安全,又省去了null的判断

 

public class Singleton {  

    private static class SingletonHolder {  

    private static final Singleton INSTANCE = new Singleton();  

    }  

    private Singleton (){}  

    public static final Singleton getInstance() {  

    return SingletonHolder.INSTANCE;  

    }  

}

5. 饿汉实现单例模式

public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return instance;  

    }  

}

6. 饿汉变种实现单例模式

public class Singleton {  

    private Singleton instance = null;  

    static {  

    instance = new Singleton();  

    }  

    private Singleton (){}  

    public static Singleton getInstance() {  

    return this.instance;  

    }  

}

7. 枚举实现单例模式

public enum EnumSingleton {  

    INSTANCE;  

    public void whateverMethod() {  

    }  

枚举其实底层是依赖Enum类实现的,这个类的成员变量都是static类型的,并且在静态代码块中实例化的,和饿汉单例模式有点像。

 

阅读(1313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~