小记Java单例模式的各种实现

单例模式是我们编程中最常用的设计模式,小记练习一下:

1、饿汉法:


public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton(){}

public static Singleton getInstance(){

return instance;

}

}

这是最简单的方法,在类引用的时候就会实例化。不能延迟加载,某种意义上会增加系统的负载。

2、懒汉法:


public class Singleton {

private static Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null){

instance = new Singleton();

}

return instance;

}

}

在饿汉法的基础上增加了延迟加载,只有调用getInstance的方法才会实例化对象,在单线程中没有问题,但在多线程中有可能导致多次实例化。

3、多线程安全型:


public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

return instance;

}

}

在instance对象加上volatile关键字,保证其对所有的线程可见性,并禁止其对指令重排序优化。在判断null和new的部分进行加锁。但是每次调用的时候,都要通过synchronize锁机制排队等待,会有效率方面的问题。

4、多线程安全性兼顾效率(双重检查锁):


public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

在synchronized关键字外层再加一个判断null,只有为null后才会进入方法内,可以减少绝大部分的锁操作。

==注意:volatile关键字在JDK 1.5之前无法完全保证指令优化重排序,所以在JDK1.5之前双重校验是有问题的==

5、静态内部类


public class Singleton {

private Singleton(){}

private static class Holder{

private static Singleton instance = new Singleton();

}

public static Singleton getInstance(){

return Holder.instance;

}

}

将创建的过程放在静态内部类中,静态内部类只有被调用的时候才会加载,所以符合延迟加载。静态内部类只会被加载一次,所以是线程安全的。

以上所有方式,在序列化的时候都需要额外的工作(Serializable、transient、readResolve()),否则在反序列化的时候都会创建一个新的实例。

6、枚举方式:


public enum Singleton {

INSTACE;

private String name;

public String getName() {

return name;

}

}

使用枚举方式实现的单例模式,自带线程安全和防止反射强行调用构造器,还提供了自动序列化的机制,防止反序列化的时候创建新的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,376评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 这是一个美好的时代,人民可以不用为了肚子发愁,同时也是一个竞争激烈的年代,年轻人压力更大。因为选择的多重性,越来越...
    wood4阅读 213评论 0 1
  • 此刻坐在从福州回南京的高铁上,回顾5天的训练营的培训生活,发生了很多事,也学到很多东西,每一次的感悟和收获都可以拿...
    林下有清风阅读 393评论 0 0
  • 早晨6点起床,赶快刷牙,然后把毛豆,紫薯,鸡蛋,红糖包一锅蒸,准备了苹果,雪梨,火龙果切块,百香果蜂蜜果汁,6点4...
    向往精灵阅读 350评论 0 0