• 01.单例模式
  • 发布于 2个月前
  • 67 热度
    0 评论

单例模式的常见应用场景:


1. Windows 的 Task Manager(任务管理器)就是很典型的单例模式。

2. windows 的 Recycle Bin(回收站)也是典型的单例应用。

3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

5. Web 应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:10:03
* 类功能 :懒汉式线程不安全单例 
* 测试结果:
1728013611
1248035566
1248035566
1248035566
1728013611
*/
public class LazyUnSafetySingleton {
	private static LazyUnSafetySingleton INSTANCE;
	private LazyUnSafetySingleton() {}
	
	public static LazyUnSafetySingleton getInstance() {
		if(null == INSTANCE) {
			INSTANCE = new LazyUnSafetySingleton();
		}
		return INSTANCE;
	}
	
}

package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:14:23
* 类功能:打印单例对象的hashcode
*/
public class SingletonThread extends Thread {
	//hash值相等对象一定相等,对象不相等,hash值可能相等。
//	@Override
//	public void run() {
//		System.out.println(LazyUnSafetySingleton.getInstance().hashCode());
//	}
//	@Override
//	public void run() {
//		System.out.println(LazySafeSingleton.getInstance().hashCode());
//	}
//	@Override
//	public void run() {
//		System.out.println(HungrySafeSingleton.getInstance().hashCode());
//	}
//	@Override
//	public void run() {
//		System.out.println(DCLSingleton.getInstance().hashCode());
//	}
//	public void run() {
//		System.out.println(LazySafeInnerClassSingleton.getInstance().hashCode());
//	}
	public void run() {
		System.out.println(EnumSingleton.INSTANCE.hashCode());
	}
}


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:16:11
* 类功能: 控制台打印结果
*/
public class TestSafe {
	public static void main(String[] args) {
		SingletonThread[] threads = new SingletonThread[10];
		//for循环创建线程组
		for(int i = 0; i < 10; i++) {
			threads[i] = new SingletonThread();
		}
		//for循环调用run方法,打印hash值
		for(int j = 0; j < 10; j++) {
			threads[j].start();
		}
	}
}


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:32:57
* 类功能:懒汉安全 + synchronized。
*/
public class LazySafeSingleton {
	private static LazySafeSingleton INSTANCE;
	private LazySafeSingleton() {}
	public synchronized static LazySafeSingleton getInstance() {
		if(null == INSTANCE) {
			INSTANCE  = new LazySafeSingleton();
		}
		return INSTANCE;
	}
}


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:41:09
* 类功能: 饿汉安全  ;利用类加载一次来实现
*/
public class HungrySafeSingleton {
	//利用类加载一次来实现。只要加载就立刻生成单例对象。
	private static HungrySafeSingleton INSTANCE = new HungrySafeSingleton();
	private HungrySafeSingleton() {}
	public static HungrySafeSingleton getInstance() {
		return INSTANCE;
	}
}


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月4日 下午11:43:46
* 类功能: 懒汉的volatile来实现。
*/
public class DCLSingleton {
	//非原子,但可见,内存屏障和先行发生。禁止指令重排序。
	private volatile static DCLSingleton INSTANCE;
	
	private DCLSingleton() {}
	public static DCLSingleton getInstance() {
		//第一次对null检测 减少锁的开支
		if(null == INSTANCE) {
			synchronized (DCLSingleton.class) { //锁住的是Class对象
				if(null == INSTANCE) {
					INSTANCE = new DCLSingleton();
				}
			}
		}
		return INSTANCE;
	}
}




package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月5日 上午12:03:43
* 类功能: 内部类实现懒汉的线程安全的单例
* 好处:外部类加载不会使其生成,只有第一次调用getInstance的时候才会加载。
*/
public class LazySafeInnerClassSingleton {
	//私有静态内部类
	private static class InnerClass {
		private static LazySafeInnerClassSingleton INSTANCE = new LazySafeInnerClassSingleton();
	}
	private LazySafeInnerClassSingleton() {}
	public static LazySafeInnerClassSingleton getInstance() {
		return InnerClass.INSTANCE;
	}
}


package com.chen.singletonmodel;
/**
* @author 陈晨
* @version 开始于:2018年10月5日 上午12:07:51
* 类功能 枚举创建 最为推荐 反序列化
* 原因:线程安全,写法简单,保证序列化,
*/
public enum EnumSingleton {
	INSTANCE;
	public void soSomeThing( ) {}
}



用户评论