单例模式(单件模式),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例。《设计模式:可复用面向对象软件的基础》一书中对单例模式的适用性的描述如下:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
延迟加载机制(lazy loading),是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
Java中单例模式的几种写法
1.懒汉式
当程序第一次访问单例模式实例时才进行创建。(单例模式的实例在系统中很少用到时,推荐使用懒汉式)
(1)延迟加载,线程不安全
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Single {
private Single(){};
private static Single instance;
public static Single getInstance(){
if(instance==null){
instance=new Single();
}
return instance;
}
}
(2)延迟加载,线程安全
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Single {
private Single (){}
private static Single instance;
public static synchronized Single getInstance() {
if (instance == null) {
instance = new Single();
}
return instance;
}
}
2.饿汉式
在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。(单例模式的实例在系统中经常用到时,推荐使用饿汉式)
(1)线程安全
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Single {
private static Single instance = new Single();
private Single (){};
public static Single getInstance() {
return instance;
}
}
3.枚举法
(1)线程安全,可防止反序列化重新创建新的对象
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public enum Single {
Single;
private Single() {}
public void print(){
System.out.println("hello world");
}
}
public class SingleTest {
public static void main(String[] args) {
Single single=Single.Single;
single.print();
}
}
4.静态内部类
(1)延迟加载,线程安全
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Single {
private static class SingleHolder {
private static final Single INSTANCE = new Single();
}
private Single (){}
public static final Single getInstance() {
return SingleHolder.INSTANCE;
}
}
单例模式的一些应用场景
1.Windows的任务管理器
2.Windows的回收站
3.网站的访问计数器
4.数据库的连接池
5.多线程的线程池
6.操作系统的文件系统
7.应用程序的日志应用,共享的日志文件只能由一个实例去操作,否则内容不好追加。
总结以上,单例模式应用的场景一般为:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。
(2)控制资源的情况下,方便资源之间的互相通信,如线程池等。
本文借鉴:
http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html
http://blog.csdn.net/tanyujing/article/details/14160941