77°

java版单例模式

单例模式可以说是最常用的设计模式之一,其主要作用就是保证一个类只有一个实例,并且提供一个访问它的全局访问点,严格的控制用户的访问方式。

单例模式又分为懒汉模式和饿汉模式,首先说一下饿汉模式:

饿汉模式

饿汉模式有点饥不择食的意思,就像一个人饿了很久,所以只要有人给东西他就吃而不考虑东西好不好吃,自己能不能吃得了。代码如下:

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

public static Singleton getInstance() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> instance;
}

}

意思大家都懂,就是一种静态初始化的方法,只要类一加载就实例化对象,优点就是线程安全,缺点就是提前占用系统资源。这时候就出现了懒汉模式:

 

懒汉模式

对比饿汉模式的饥不择食,懒汉模式的意思就是饭送到嘴边才吃,否则再饿也不会动嘴。代码如下:

public class Singleton{
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Singleton instance;

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Singleton(){}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Singleton getInstance() {
    </span><span style="color: #0000ff;">if</span> (instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
        instance </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Singleton();
    }
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> instance;
}<br>}</span></pre> 

然而在多线程同时调用getInstance()方法时,会有可能创建多个实例,所以这一版线程是不安全的,于是又有了下面这一版:

public class Singleton {
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Singleton instance;

</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Singleton (){}

</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> Singleton getInstance() {
    </span><span style="color: #0000ff;">if</span> (instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {  
        </span><span style="color: #0000ff;">synchronized</span> (Singleton .<span style="color: #0000ff;">class</span><span style="color: #000000;">) {  
        </span><span style="color: #0000ff;">if</span> (instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">) {  
            instance </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Singleton ();  
            }  
        }  
    } 
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> instance;
}

}

用双重锁定的方法来保证当instance == null时,多个线程调用getInstance()方法时,都可以通过第一重判断的问题。

一般情况下饿汉的单例模式就可以满足大部分的需求了,关于单例模式基本情况就是这样了。

本文转载自博客园,原文链接:https://www.cnblogs.com/0000cjw/p/11930082.html

全部评论: 0

    我有话说: