一、单例模式的定义
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一的实例,是一种对象创建型模式。
二、单例模式的实现方法
1、饿汉式
class Singleton{
private Singleton(){
}
private final static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
class Singleton{
private Singleton(){
}
private static 单列模式.type2.Singleton instance;
static {
instance=new 单列模式.type2.Singleton();
}
public static 单列模式.type2.Singleton getInstance(){
return instance;
}
}
优缺点分析
饿汉模式是线程安全的,但是他只能没有实现懒加载,如果没有用这个实例的话,会有资源浪费的现象
2、懒汉式
class Singleton{
private static Singleton instance;
private Singleton(){};
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
class Singleton{
private static Singleton instance;
private Singleton(){};
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
优缺点分析
第一种懒汉模式虽然实现了懒加载,但是线程不安全,有可能会创建多个实例对象,第二种虽然同时实现了线程安全以及懒加载,但是因为加了synchronized关键字导致效率大大下降
3、双重检查
class Singleton{
private static volatile Singleton instance;
private Singleton(){};
public static Singleton getInstance(){
if(instance==null){
synchronized(SingletonTest05.class){
if(instance==null)
instance=new Singleton();
}
}
return instance;
}
}
优缺点分析
使用了volatile关键字,及实现了懒加载和线程安全,又不会有太多效率问题推荐使用
4、静态内部类
class Singleton{
private Singleton(){};
private static class SingletonInstance{
private static final Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.instance;
}
}
优缺点分析
因为在类加载的时候是不会加载静态内部类的,所以只有调用方法的时候才会创建对象符合懒加载,同时线程也是安全的,推荐使用
4、枚举
enum Singleton{
INSTANCE;
public void sayOK(){
System.out.println("ok");
}
}
优缺点分析
这也是James Gosling推荐的一种实现方法
三、总结
单例模式在java.lang.Runtime包中有使用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c208238871c11a992450c3042e3467b3.png)
很明显这是用了饿汉模式
以上都是个人学习总结如有错误,请指出,谢谢。