单例设计模式
1单例模式概述
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
通常单例模式在Java语言中,有两种构建方式:
懒汉方式:指全局的单例实例在第一次被使用时构建。
饿汉方式:指全局的单例实例在类装载时构建
单例模式在构建的时候主要包括以下两个步骤
1、私有化构造方法
2、提供一个静态方法
2 实例
1、懒汉式
public class Singleton1 {
private final static Singleton1 SINGLETON_1 = new Singleton1();
private Singleton1() {
}
public static Singleton1 getSingleton1() {
return SINGLETON_1;
}
}
线程安全,在类装载的时候实例化对象,避免线程同步的问题
2、懒汉式
public class Singleton2 {
private static Singleton2 singleton2;
static {
singleton2 = new Singleton2();
}
private Singleton2() {
}
public static Singleton2 getSingleton2() {
return singleton2;
}
}
线程安全,在类装载的时候实例化对象,避免线程同步的问题
3、饿汉式
public class Singleton3 {
private static Singleton3 singleton3 = null;
private Singleton3() {
}
public static Singleton3 getSingleton3() {
if (singleton3 == null) {
singleton3 = new Singleton3();
}
return singleton3;
}
}
线程不安全,最好不要这样写
4、饿汉式
public class Singleton4 {
private static Singleton4 singleton4 = null;
private Singleton4() {
}
public static synchronized Singleton4 getSingleton4() {
if (singleton4 == null) {
singleton4 = new Singleton4();
}
return singleton4;
}
}
线程安全,但是在多线程环境下效率并不高
5、双重校验锁
public class Singleton5 {
private volatile static Singleton5 singleton5 = null;
private Singleton5() {
}
public static Singleton5 getSingleton5() {
if (singleton5 == null) {
synchronized (Singleton5.class) {
if (singleton5 == null) {
singleton5 = new Singleton5();
}
}
}
return singleton5;
}
}
使用双重校验锁,线程安全
6、枚举类
public enum Singleton6 {
SINGLETON_6;
public void whateverMethod() {
}
}
枚举类,线程安全
7、静态内部类
public class Singleton7 {
private Singleton7() {
}
private static class Singleton7Instance {
private static final Singleton7 SINGLETON_7 = new Singleton7();
}
public static Singleton7 getSingleton7() {
return Singleton7Instance.SINGLETON_7;
}
}
8、