1、定义:
所谓单例类就是指该类只能有一个实例对象,无论如何获取拿到的都是同一个对象。
2、用处:
整个系统中只允许new 一个对象。spring 容器默认单实例。
3、实现:
(1)定义一个静态全局对象引用。
(2)该类构造函数保护,private。
(3)提供静态方法获取该实例。
(4)由于需要一个全局对象引用,考虑多线程获取的安全问题。
(5)性能,懒加载or初始化加载。
package designpattern;
public class SingletonPattern {
public static void main(String[] args) throws Exception {
Singleton1 singleton1 = Singleton1.getInstance();
Singleton1 singleton2 = Singleton1.getInstance();
System.out.println(singleton1 == singleton2);
}
}
//非线程安全,获取时加载 。
//thread1 、2 同时 进入 if (singleton1 == null) {
//可能获取不同的实例对象
class Singleton1 {
private static Singleton1 singleton1 = null;
private Singleton1() {
}
public static Singleton1 getInstance() {
if (singleton1 == null) {
singleton1 = new Singleton1();
}
return singleton1;
}
}
//线程安全,饿汉式 ,加载字节码文件初始化一个该实例
//jvm加载字节码进行类的初始化的时候是不允许其他线程进入的,静态成员变在
//类第一次加载的时候初始化,这里利用jvm保
//证、线程的安全
class Singleton2 {
private static final Singleton2 INSTANCE = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance() {
return INSTANCE;
}
}
//线程安全,同步整个方法,每次获取都要去占锁,不优雅,效率较低
class Singleton3 {
private static Singleton3 singleton3 = null;
private Singleton3() {
}
public static synchronized Singleton3 getInstance() {
if (singleton3 == null) {
singleton3 = new Singleton3();
}
return singleton3;
}
}
//静态内部类实现,线程安全,比饿汉试好。推荐
class Singleton4 {
private static class SingletonHolder {
private static final Singleton4 INSTANCE = new Singleton4();
}
private Singleton4() {
}
public static Singleton4 getInstance() {
return SingletonHolder.INSTANCE;
}
}
//二次判null 线程安全,优雅效率高。推荐
class Singleton5 {
private static volatile Singleton5 singleton5 = null;
private Singleton5() {
}
public static Singleton5 getInstance() {
if (singleton5 == null) {
synchronized (Singleton5.class) {
if (singleton5 == null) {
return new Singleton5();
}
}
}
return singleton5;
}
}
//枚举实现,不太懂,不推荐。
enum Singleton6 {
INSTANCE;
//任意方法,调用时使用INSTANCE.方法名
public void whateverMethod() {
}
网友评论