Java 单例

Posted 一任阶前、点滴到天明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 单例相关的知识,希望对你有一定的参考价值。

最近在网上看到一篇关于 Java 单例的创建问题,虽然是一个 Java 程序员,但是到现在还没有真正的深入了解到 Java 的原理和机制。所以每每看到这样能够“真正”接触 Java 的机会内心总是充满了欣喜。记录下,以后备用。

懒汉模式

public class Singlton{
    private static Singleton instance;

    private Singlton(){}

    public static Singlton getInstance(){
        if(instacne == null)
            instance = new Singlton();
        return instance;
    }
} 

 

教科书式的写法,但是无法适用于多线程的状态下。

饿汉模式

public class Singleton{
    private static Singletion instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

饿汉模式可以有效的避免多线程的同步问题,不过使用 static 会多多少少牺牲点性能。

静态内部类

public class Singleton{
    private static class SingltonHolder{
        private static final Singleton INSTANCE = new Singlton();
    }

    private Singleton(){}

    public static final Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }    
}

使用静态内部类的方式,利用 ClassLoder 的机制保证了初始化的时候只有一个线程,并且兼顾了性能——Singleton 类被装载的时候,getInstance 并不会立马初始化,只有调用的时候才会被初始化。

枚举

public enum Singleton{
    INSTANCE;

    public void method(){
        //do something
    }
}

这种方式 Effective Java 中推荐的方式,很厉害的一种写法。唯一的缺点就是无法继承了吧。

小结

虽然只是创造一个单例,但是其中需要考虑的东西真的有很多。不得不感叹那些编程高手,能够将心思缜密,利用语言的各种特性去编程创造。对于创建单例模式还是比较推荐使用静态内部类的方式创建,不失性能的同时又兼顾安全。但是其实我更加喜欢枚举的方式。

以上是关于Java 单例的主要内容,如果未能解决你的问题,请参考以下文章

单例片段或保存网页视图状态

常用代码片段

常用代码片段

性能比较好的单例写法

java的单例模式怎么能保证始终是单例

死磕 Spring----- IOC 之从单例缓存中获取单例 bean