单例模式 :
保证全局只有一个类只有一个实例,并且提供一个访问该实例的访问点;
例子:
windows的回收站,任务管理器,文件系统,
应用程序的日志应用,
数据连接池的设计,
spring的控制器,Bean
Application也是典型的单例应用
********************************
分类:
1,饿汉式 天然线程安全 不能懒加载 效率高 但是浪费资源
2,懒汉式 懒加载 加锁效率低
3,双重检测锁式 jvm 底层不安全一般不用
4,静态内部类 天然线程安全 懒加载 效率高 全部具备了 一般框架会用
5,枚举单例 jvm实现的天然线程安全,反射和反序列化都不能破解; 不能懒加载
*************************
代码实现:
1,饿汉式
package com.singleton;
/**
* 饿汉式
* */
public class SingletonDemo1 {
// 类加载时 就获取到了对象
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() { // 私有化构造器
}
public static SingletonDemo1 getInstance() {
// 开放一个方法来获取实例
return instance;
}
}
2,懒汉式
package com.singleton;
/**
* 懒汉式
* */
public class SingletonDemo2 {
// 类加载时 没有做任何事情
private static SingletonDemo2 instance ;
private SingletonDemo2() { // 私有化构造器
}
// 在调用方法的时候再去加载类 ;懒加载
public synchronized static SingletonDemo2 getInstance() {
if(instance==null) {
instance = new SingletonDemo2();
}
return instance;
}
}
3,双重检测锁式
package com.singleton;
/**
* 双重检测锁式
* */
public class SingletonDemo3 {
private String str = "";
private int a = 0;
private volatile static SingletonDemo3 ins = null;
/**
* 构造方法私有化
*/
private SingletonDemo3(){
str = "hello";
a = 20;
}
/**
* DCL方式获取单例
* @return
*/
public static SingletonDemo3 getInstance(){
if (ins == null){
synchronized (SingletonDemo3.class){
if (ins == null){
ins = new SingletonDemo3();
}
}
}
return ins;
}
}
4,静态内部类
package com.singleton;
public class SingletonDemo4 {
// 初始化的时候不会加载初始化资源,调用方法才会;
private static class SingletonInstance{
private static final SingletonDemo4 instance = new SingletonDemo4();
}
// 调用方法生成实例
public static SingletonDemo4 getInstance() {
return SingletonInstance.instance;
}
private SingletonDemo4() { // 私有化构造器
}
}
5,枚举单例
package com.singleton;
/**
* 枚举
* 天然就是单例
* */
public enum SingletonDemo5 {
instance;
}