方式7种
- 饿汉式(静态变量)
- 优势:
- 简单易写
- 线程安全
- 劣势:浪费内存空间,只要类进行了加载,即使不使用对应的实例,也会进行加载
class MySingleton {
private static MySingleton singleton = new MySingleton();
private MySingleton() {
}
public static MySingleton getInstance() {
return singleton;
}
}
- 饿汉式(静态代码块)
- 优势:与静态变量差不错的意思
- 劣势:缺点也和静态变量差不多
class StaticBlockSingleton {
private static StaticBlockSingleton singleton;
static {
singleton = new StaticBlockSingleton();
}
private StaticBlockSingleton() {
}
public static StaticBlockSingleton getInstance() {
return singleton;
}
}
- 懒汉式(非线程安全)
- 优势:在不需要使用实例的时候不会进行创建,不会浪费内存空间
- 劣势:在多线程的情况下,可能产生不同的对象
- 总结:不推荐使用
class ThreadUnSafeSingleton {
private static ThreadUnSafeSingleton singleton3;
private ThreadUnSafeSingleton() {
}
public static ThreadUnSafeSingleton getInstance() {
if (singleton3 == null) {
singleton3 = new ThreadUnSafeSingleton();
}
return singleton3;
}
}
- 懒汉式(线程安全,效率低)
- 优势:在多线程使用的情况下,线程安全了
- 劣势:由于将锁关键字synchronized放在方法上,锁定范围较大,效率不高
- 总结:不建议使用
class ThreadSafeSingleton {
private static ThreadSafeSingleton singleton;
private ThreadSafeSingleton() {
}
public static synchronized ThreadSafeSingleton getInstance() {
if (singleton == null) {
singleton = new ThreadSafeSingleton();
}
return singleton;
}
}
- 双检查(线程安全)
- 优势:其实也是懒汉式的一种,线程安全,且缩小了锁的锁定范围,效率比懒汉式高一点(可忽略不及)
- 劣势:不晓得
- 总结:可以使用
class DoubleCheckSingleton {
private static DoubleCheckSingleton singleton5;
private DoubleCheckSingleton() {
}
public static DoubleCheckSingleton getInstance() {
if (singleton5 == null) {
synchronized (DoubleCheckSingleton.class) {
if (singleton5 == null) {
singleton5 = new DoubleCheckSingleton();
}
}
}
return singleton5;
}
}
- 静态内部类
- 优势:属于懒加载一种,外部类加载时不会加载内部类,所以在获取实例钱不会创建对象,节约了内存
- 劣势:不晓得
- 总结:推荐使用
class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {
}
public static StaticInnerClassSingleton getInstance() {
return InnerClass.singleton;
}
private static class InnerClass {
private static StaticInnerClassSingleton singleton = new StaticInnerClassSingleton();
}
}
- 枚举
- 优势:
- 高级,洋气,晓得的人相对比较小
- 线程安全
- 防止反序列化重新创建新的对象
- 劣势:不晓得
enum EnumSingleton {
INSTANCE;
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}