单例模式
一、核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
二、应用举例:Windows中的任务管理器,Windows中的回收站,配置文件的类只有一个单例,severlet,spring中的bean等。
三、优点:由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永驻内存的方式解决。
单例模式可以在系统设置全局访问点,优化环共享资源访问。
四、常见的两种应用方式:
一般为私有构造器,提供开放的访问方法。
1.饿汉模式
Public class SingletonDemo1 {
//初始化时就立即加载,没有延时加载,天然的线程安全,调用效率高
Private static SingletonDemo1 instance = new SingletonDemo1();
Private SingletonDemo1(){
}
Public static SingletonDemo1 getInstance(){
Return instance;
}
}
2.懒汉式
Public class SingletonDemo2 {
//初始化时不会立即加载,延时加载,线程不安全,需要加锁同步,资源利用效率高
Private static SingletonDemo1 instance;
Private SingletonDemo2(){
}
Public static synchronized SingletonDemo2 getInstance(){
If(instance==null)
instance = new SingletonDemo2();
Return instance;
}
}
三种拓展:
3.双重检测所锁实现
这个模式将同步内容下调到if内部,提高了执行的效率,不必每次获取对象都需要进行同步,只有第一次才同步创建了以后就没必要了。
问题是由于编译器优化问题原因和JVM底层内部模型原因,偶尔会出现问题,不建议使用。
pubilc class SingletonDemo3{
private static SingletonDemo3 instance = null;
private static SingletonDemo3 getInstance() {
if(instance == null){
SingletonDemo3 sc;
synchronized (SingletonDemo3.class){
sc = instance;
if(sc == null){
synchronized (SingletonDemo3.class){
if(sc == null){
sc = new SingletonDemo3();
}
}
instance = sc;
}
}
return instance;
}
private SingletonDemo3(){
}
}
4.静态内部类实现
线程安全 懒加载 并发高效调用
public class SingletonDemo4{
private static class SingletonClassInstance{
private static final SingletonDemo4 instance = new SingletonDemo4();
}
private SingletonDemo4(){
}
public static SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
}
5.枚举实现单例模式
缺点:无延迟加载
public enum SingletonDemo5{
//枚举元素本身就是单例对象
INSTANCE;
public static SingletonOperation(){
}
}