**
设计模式之单例模式(6种实现方法)
**
设计模式—单例
1.单例第概念
Ensure a class has only one instance, and provide a global point of access to it.
(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
图解
2.好处
对于频繁使用的对象,可以省略创建对象所花费的时间,对于那些重量级对象而言,
是非常可观的一笔系统开销
由于new操作的次数减少,因而对系统内存的使用频率也会降低,
这将减轻GC压力,缩短GC停顿时间
单例第6种模式
1.饿汉模式
public class SingletonModeDemo1 {
private static final SingletonModeDemo1 singletonMode = new SingletonModeDemo1();
private SingletonModeDemo1(){
System.out.println("单例模式——饿汉模式");
}
public static SingletonModeDemo1 getInstance(){
return singletonMode;
}
public static void say(){
System.out.println("我是一个单例模式");
}
}
不足之处:无法对instance实例进行延时加载
优化方案:懒汉模式
2.懒汉模式
代码
public class SingletonModeDemo2 {
private static SingletonModeDemo2 singletonMode;
private SingletonModeDemo2(){
System.out.println("单例模式——懒汉模式");
}
public static SingletonModeDemo2 getInstance(){
if(singletonMode ==null){
singletonMode = new SingletonModeDemo2();
}
return singletonMode;
}
}
不足之处:无法保证线程安全
优化:懒汉线程安全模式
3.懒汉线程安全
public class SingletonModeDemo3 {
private static SingletonModeDemo3 singletonMode;
private SingletonModeDemo3(){
System.out.println("单例模式——懒汉线程安全模式");
}
//第一种模式,在方面上添加synchronized
public static synchronized SingletonModeDemo3 getInstance(){
if(singletonMode ==null){
singletonMode = new SingletonModeDemo3();
}
return singletonMode;
}
//第二种方法在代码块种添加synchronized
public static SingletonModeDemo3 getInstance1(){
synchronized(SingletonModeDemo4.class){
if(singletonMode ==null){
singletonMode = new SingletonModeDemo3();
}
}
return singletonMode;
}
}

不足之处:性能
优化:DCL
4.DCL(双层检索)
public class SingletonModeDemo4 {
private static volatile SingletonModeDemo4 singletonMode;
private SingletonModeDemo4(){
System.out.println("单例模式——DCL");
}
public static SingletonModeDemo4 getInstance(){
if(singletonMode == null){
synchronized(SingletonModeDemo4.class){
if(singletonMode ==null){
singletonMode = new SingletonModeDemo4();
}
}
}
return singletonMode;
}
}
5.静态内部类
public class SingletonModeDemo5 {
private SingletonModeDemo5(){
}
public static SingletonModeClass getInstance(){
return SingletonModeClass.singletonModeClass;
}
private static class SingletonModeClass{
private static final SingletonModeClass singletonModeClass = new SingletonModeClass();
}
}
6.枚举
public enum SingletonModeDemo6 {
INSTANCE;
public void say(){
System.out.println("单例模式——枚举");
}
}