Java设计模式-单例模式
Java设计模式——单例模式
描述:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给所有其他对象提供这一实例
线程安全问题:
1、在获取单例的时候,要保证不能产生多个实例对象
2、注意单例对象内的实例变量是会被多线程共享的
实现单例模式方式
1、饿汉式:静态变量,静态代码快
2、懒汉式:线程不安全 、线程不安全,并发小、双重检测锁模式,简称DCL懒汉式
3、静态内部类
4、枚举
一、饿汉式
1、静态变量
/*
* 静态变量方式
*/
public class SingletonHungry {
private SingletonHungry() {}
private final static SingletonHungry hungry = new SingletonHungry();
public static SingletonHungry getInstance() {
return hungry;
}
}
2、静态代码快
/*
* 静态代码快
*/
public class SingletonHungry {
private SingletonHungry() {}
private static SingletonHungry hungry;
static {
hungry = new SingletonHungry();
}
public static SingletonHungry getInstance() {
return hungry;
}
}
二、懒汉式
1、线程不安全
/*
* 线程不安全
*/
public class SingletonLazyMan {
private SingletonLazyMan() {}
private static SingletonLazyMan lazyMan;
public static SingletonLazyMan getInstance() {
if(null == lazyMan) {
lazyMan = new SingletonLazyMan ();
}
return lazyMan;
}
}
2、线程不安全,并发小
/*
* 线程不安全,并发小
*/
public class SingletonLazyMan {
private SingletonLazyMan() {}
private static SingletonLazyManlazyMan;
public static synchronized SingletonLazyMan getInstance() {
if(null == lazyMan) {
lazyMan = new SingletonLazyMan();
}
return lazyMan;
}
}
3、双重检测锁模式:简称DCL懒汉式
/*
* 效率高,延迟加载,线程安全,推荐使用
*/
public class SingletonLazyMan{
private SingletonLazyMan() {}
private volatile static SingletonLazyMan lazyMan;
// 双重检测锁模式,简称DCL懒汉式
public static SingletonLazyMan getInstance() {
if(null == lazyMan) {
synchronized (SingletonLazyMan.class) {
if(null == SingletonLazyMan) {
lazyMan = new SingletonLazyMan();
}
}
}
return lazyMan;
}
}
三、静态内部类
静态内部类
/*
* 避免了线程不安全,延迟加载,效率高,推荐使用
*/
public class SingletonStaticInner {
private SingletonStaticInner() {}
private static class InnerClass{
private static final SingletonStaticInner INSTANCE = new SingletonStaticInner();
}
public static SingletonStaticInner getInstance() {
return InnerClass.INSTANCE;
}
}
四、枚举
枚举
/*
* 防止反射破坏,推荐使用
*/
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}