一. 单件模式:保证一个类仅有一个实例,并提供一个全局访问点。
二. 实例
懒汉式:
双重检查加锁:减少使用同步,一个私有构造器,一个静态方法,一个静态变量。
public class Singleton { private volatile static Singleton uniqueInstance; //volatile提示JVM这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 private Singleton() { }//把构造器声明为私有的,只有在本类内才能调用构造器。 public static Singleton getInstance() { //需定义成静态方法 if (uniqueInstance == null) { //防止每次进行判断之前都要经过lock锁定,耗时。 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } public String getDescription() { return "I'm a thread safe Singleton!"; } }
饿汉式:不管用不用,一开始就建立这个单例对象。
public class Singleton{ private static Singleton uniqueInstance = new Singleton(); //建立对象 private Singleton(){ } public static Singleton getInstance(){ return uniqueInstance ;//直接返回单例对象 } }
测试类:
public class SingletonClient { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println(singleton.getDescription()); } }
三. 应用场景
1. 单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免资源操作时导致的性能或损耗等。如日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
2. 常见应用:
任务管理器,回收站,网站的计数器,数据库连接池,多线程的线程池,应用程序的日志应用, Web应用的配置对象的读取 等。