一个类有且仅有一个实例,并且自行实例化向整个系统提供。
2. 特点
a. 一个类只有一个实例
b. 必须自行创建该实例
c. 必须自行向整个系统提供该实例
d. 不能被继承
3. 单例模式的作用?
保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
4. 单例模式实现方式?
a. 饿汉式
public class Singleton {
private static EagerSingleton instance = new EagerSingleton();
private Singleton() { //私有构造函数 }
public static EagerSingleton getInstance()
{
return instance;
}
}
b. 懒汉式
// 懒汉式---存在线程安全问题---会产生多个实例
public class SingletonClass{
private static SingletonClass instance=null;
private SingletonClass(){}
public static SingletonClass getInstance(){
if(instance==null){
instance=new SingletonClass();
}
}
return instance;
}
}
// 懒汉式---不存在线程安全问题------效率比较低
public class SingletonClass{
private static SingletonClass instance=null;
private SingletonClass(){}
public static synchronized SingletonClass getInstance(){
if(instance==null){
instance=new SingletonClass();
}
}
return instance;
}
}
// 懒汉式---不存在线程安全问题-----效率高
public class SingletonClass{
private static SingletonClass instance=null;
private SingletonClass(){}
public static SingletonClass getInstance(){
if(instance==null){
synchronized(SingletonClass.class){
if(instance==null){
instance=new SingletonClass();
}
}
}
return instance;
}
}
说明:synchronized方法与synchronized代码快的区别
synchronized methods(){} 便于阅读理解;
synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
5. 单例模式实现方式的区别:
饿汉式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
懒汉式:在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
6. 单例模式应用:
a. 在线人数;
b. windows任务管理器----只能打开一个;
c. windows回收站;
d. 应用程序的日志应用---在整个系统运行过程中,回收站一直维护者仅有的一个实例;
e. web应用的配置对象的读取---配置文件是共享的资源;
f. 数据库连接池的设计---采用单例能节省打开或关闭数据库连接所引起效率损耗;
7. 线程安全与CPU核数有关吗?
无关,只是在单核情况下,有些问题复现概率更低。