首页 > 其他 > 详细

设计模式 - 单例模式

时间:2017-06-10 13:17:12      阅读:210      评论:0      收藏:0      [点我收藏+]

定义:确保一个类只有一个实例,并提供一个全局访问点。

一、线程不安全的

1、饱汉式,只有在被第一次调用的时候才创建实例。

技术分享
package com.singleton;

public class Singleton {
    
    // 利用静态变量创建唯一实例
    private static Singleton instance;
    
    // 构造器定义为私有的,防止外部创建对象
    private Singleton(){
        
    }
    
    // 获取实例
    public static Singleton getInstance() {
        if(null == instance){
            instance = new Singleton();
        }
        
        return instance;
    }

}
View Code

 

二、线程安全的

1、饿汉式,类加载时就创建实例。

技术分享
package com.singleton;

public class Singleton {
    
    // 利用静态变量创建唯一实例
    private static Singleton instance = new Singleton();
    
    // 构造器定义为私有的,防止外部创建对象
    private Singleton(){
        
    }
    
    // 获取实例
    public static Singleton getInstance() {
        return instance;
    }

}
View Code

2、和饱汉式很像,只是加了个关键字synchronized使其变成线程安全的,但是如果是频繁创建实例,那就会降低性能。

技术分享
package com.singleton;

public class Singleton {
    
    // 利用静态变量创建唯一实例
    private static Singleton instance;
    
    // 构造器定义为私有的,防止外部创建对象
    private Singleton(){
        
    }
    
    // 获取实例,使用synchronized关键字使获取实例为线程安全的
    public static synchronized Singleton getInstance() {
        if(null == instance){
            instance = new Singleton();
        }
        
        return instance;
    }

}
View Code

3、双重检查加锁,先检查实例是否为空后才进行同步处理,同步块的代码只执行一次。

技术分享
package com.singleton;

public class Singleton {
    
    // 利用静态变量创建唯一实例
    private static volatile Singleton instance;
    
    // 构造器定义为私有的,防止外部创建对象
    private Singleton(){
        
    }
    
    // 获取实例,使用synchronized关键字在类上使获取实例为线程安全的
    public static Singleton getInstance() {
        if(null == instance){
            synchronized (Singleton.class) {
                if(null == instance){
                    instance = new Singleton();
                }
            }
        }
        
        return instance;
    }

}
View Code

4、静态内部类方式创建实例。

技术分享
package com.singleton;

public class Singleton {
    
    // 构造器定义为私有的,防止外部创建对象
    private Singleton(){
        
    }
    
    // 获取实例
    public static Singleton getInstance() {
        return LazyHolder.instance;
    }
    
    // 静态内部类
    private static class LazyHolder {    
        private static final Singleton instance = new Singleton();    
     } 

}
View Code

三、总结

1、饿汉和饱汉式的区别就是实例加载的时间不同,饿汉实例随类加载而创建,饱汉是调用时创建实例。

2、单例模式有线程安全和不安全之分,注意恰当使用。

 

设计模式 - 单例模式

原文:http://www.cnblogs.com/mengxuanyou/p/6978409.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!