码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(3)---单例模式

时间:2016-08-02 00:59:51      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

单例模式 Singleton (创建型模式)

 

1.定义

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

 

2.结构图

技术分享

 

3.代码

懒汉式

 1 /*
 2  * 懒汉式
 3  * 实现了延迟创建和保证了线程安全
 4  */
 5 public class Singleton {
 6 
 7     private static Singleton instance = null ;
 8     
 9     private Singleton() {
10         
11     }
12     
13     public static synchronized Singleton getInstance(){
14         if (instance == null){
15             instance = new Singleton() ;
16         }
17         return instance ;
18     }
19 
20 }

 

双重锁形式 

synchronized对整个方法加锁是没必要的,只要保证实例化对象的那段代码不被多线程同时访问就行了,当两个线程同时访问这个方法时,假设这时对象还没有被实例化,他们都可以通过第一重instance==null的判断,然后由于lock机制,这两个线程只有一个能进入,如果没有第二重的判断,则第一个线程创建了实例后,第二个线程还是可以继续再创建新的实例。

 1 /*
 2  * 双重锁形式
 3  * 
 4  */
 5 public class Singleton {
 6 
 7     private static Singleton instance = null ;
 8     
 9     private Singleton() {
10         
11     }
12     
13     public static  Singleton getInstance(){
14         if (instance == null){
15             synchronized(Singleton.class){
16                 if (instance == null){
17                     instance = new Singleton() ;
18                 }
19             }    
20         }
21         return instance ;
22     }
23 
24 }

采用静态内部类的形式
Java中静态内部类可以访问其外部类的成员属性和方法,同时,静态内部类只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式,在静态内部类中静态初始化外部类的单一实例即可。
既是线程安全的,同时又提升了性能
 1 /*
 2  * 懒汉形式改进版   采用了静态内部类
 3  * 
 4  */
 5 public class Singleton {
 6 
 7     private Singleton() {
 8         
 9     }
10     private static class LazyHolder{
11         private static final Singleton instance = new Singleton();
12     }
13     
14     public static  Singleton getInstance(){
15         return LazyHolder.instance ;
16     }
17 
18 }

 

饿汉形式

 1 /*
 2  * 饿汉形式
 3  * 
 4  */
 5 public class Singleton {
 6 
 7     private static final Singleton instance = new Singleton() ;
 8     
 9     private Singleton() {
10         
11     }
12     
13     public static  Singleton getInstance(){
14         return instance ;
15     }
16 
17 }

 

 

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,

而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

 

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

设计模式(3)---单例模式

标签:

原文地址:http://www.cnblogs.com/-Buff-/p/5727627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!