这是我参与 8 月更文挑战的第 2 天,活动详情查看: 8月更文挑战
1.单例模式是什么
Java种的单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。 顾名思义就是在Java程序中某个类只且只有一个对象。
2.单例模式有哪几种写法
单例模式根据加载时间可以分为饿汉式和懒汉式。 饿汉式是在类加载过程中就加载的,并不考虑是否用到该类的对象,而懒汉式是在需要用到某类的对象就加载的。
3.单例模式的JAVA实现代码
3.1 饿汉式
饿汉式的单例模式可以分为以下三种;
1.直接实例化
public class Singleton1{
/**
* 1、构造器私有化
* 2、自行创建,并且用静态变量保存
* 3、向外提供实例
* 4、强调这是一个单例,我们可以用final修改
*/
private Singleton1() {
}
public static final Singleton1 INSTANCE = new Singleton1();
}
2.枚举方式
/**
* 枚举类型:表示该类型是有限的几个
*/
INSTANCE
private Singleton2 instance;
SomeThing() {
instance = new Singleton2 ();
}
public Resource getInstance() {
return instance;
}
}
3.静态块
public class Singleton3 {
/**
* 静态代码块
*/
public static final Singleton3 INSTANCE;
private String info;
static {
try {
INSTANCE = new Singleton3("123");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private Singleton3(String info) {
this.info = info;
}
}
3.2 懒汉式
懒汉式的单例模式也可以分为两种;
1.线程不安全
public class Singleton4 {
/**
* 1、构造器私有化
* 2、用一个静态变量保存这个唯一的实例
* 3、提供一个静态方法,获取这个实例对象
*/
static Singleton4 instance;
private Singleton4() {}
public static Singleton4 getInstance() {
if (instance == null) {
instance = new Singleton4();
}
return instance;
}
}
2.线程安全
实现方式1:
public class Singleton5 {
/**
* 1、构造器私有化
* 2、用一个静态变量保存这个唯一的实例
* 3、提供一个静态方法,获取这个实例对象
*/
static Singleton5 instance;
private Singleton5() {}
public static Singleton5 getInstance() {
if (instance == null) {
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
return instance;
}
}
return instance;
}
}
实现方式2:
public class Singleton6 {
/**
* 1、内部类被加载和初始化时,才创建INSTANCE实例对象
* 2、静态内部类不会自动创建,随着外部类的加载初始化而初始化,他是要单独去加载和实例化的
* 3、因为是在内部类加载和初始化时,创建的,因此线程安全
*/
private Singleton6(){}
public static class Inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstance() {
return Inner.INSTANCE;
}
}
4.单例模式作用
减少不必要的内存开销;提高程序性能。