设计模式之单例模式

Posted

tags:

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

个人理解,单例模式就是创建一个独一无二的对象,在我们需要时才创建,如果用全局静态变量代替的话,就必须在程序一开始就创建,可能造成资源浪费。

单例模式确保一个类只有一个实例,并提供一个全局的访问点。

先来看看一个经典的单例模式代码:

 1 package cn.sp.singleton;
 2 /**
 3  * 单例模式  --  使用懒加载  -- 只适合单线程
 4  * @author 2YSP
 5  *
 6  */
 7 public class Singleton {
 8     
 9     private static Singleton singleton;
10     
11     private Singleton(){
12         
13     }
14     
15     public static Singleton getInstance(){//但是如果是多线程的话,会产生不同的实例,而不是一个独一无二的对象
16         if(singleton == null){
17             singleton = new Singleton();
18         }
19         
20         return singleton;
21     }
22 }

但是如果是多线程的话,会出问题。以下是改进后的代码。

 1 package cn.sp.singleton;
 2 /**
 3  * 单例模式  --  使用懒加载  -- 多线程版
 4  * @author 2YSP
 5  *
 6  */
 7 public class Singleton2 {
 8     
 9     private static Singleton2 singleton;
10     
11     private Singleton2(){
12         
13     }
14     
15     public synchronized static Singleton2 getInstance(){//使用同步,但是执行效率降低
16         if(singleton == null){
17             singleton = new Singleton2();
18         }
19         
20         return singleton;
21     }
22 }

package cn.sp.singleton;
/**
 * 单例模式  --  立即创建  -- 多线程版
 * @author 2YSP
 *
 */
public class Singleton3 {
    
    private static Singleton3 singleton = new Singleton3();
    
    private Singleton3(){
        
    }
    //如果应用程序总是创建并使用单件实例,或者在创建和运行方面的负担不太繁重,可使用此方法
    public  static Singleton3 getInstance(){
        
        return singleton;
    }
}
 1 package cn.sp.singleton;
 2 /**
 3  * 单例模式  --  加锁  -- 多线程版
 4  * @author 2YSP
 5  *
 6  */
 7 public class Singleton4 {
 8     
 9     private volatile static Singleton4 singleton ;//volatile 关键字保证变量的可见性
10     
11     private Singleton4(){
12         
13     }
14     //使用“双重检查加锁”,在getInstance()中减少使用同步,提示效率
15     public  static Singleton4 getInstance(){
16         if(singleton == null){
17             synchronized (Singleton4.class) {
18                 if(singleton == null){
19                     singleton = new Singleton4();
20                 }
21             }
22         }
23         return singleton;
24     }
25 }

 

具体使用哪种,要根据实际情况而定。

 

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

设计模式之单例模式

Java设计模式之单例模式

设计模式之单例模式以及简单代码实现

设计模式之单例设计模式

设计模式之单例模式

设计模式之单例模式