- 什么是单例模式:
对象在一个进程中有且只有一个实例,并提供一个访问它的全局访问点。
- 代码实例1:
package com.caocl.designmode.singletonMode;
/**
* 饿汉式
* 类加载到内存后,就实例化一个单例,jvm保证线程安全
* 简单实用,推荐使用
* 缺点:不管用到与否,类加载时都会完成实例化
*/
public class One {
private static final One INSTANCE = new One();
private One() {}
public static One getInstance() {return INSTANCE;}
}
- 代码实例2:
package com.caocl.designmode.singletonMode;
public class Two {
private static final Two INSTANCE;
static {
INSTANCE = new Two();
}
private Two(){}
public static Two getInstance() {
return INSTANCE;
}
}
- 代码实例3:
package com.caocl.designmode.singletonMode;
/**
* lazy loading
* 也称懒汉式
* 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
*/
public class Three {
private static Three INSTANCE;
private Three() {}
public static Three getInstance() {
if (INSTANCE == null) {
return new Three();
}
return INSTANCE;
}
}
- 代码实例4:
package com.caocl.designmode.singletonMode;
/**
* lazy loading
* 也称懒汉式
* 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
* 可以通过synchronized加锁解决,但是会降低效率
*/
public class Four {
private static Four INSTANCE;
private Four() {}
public static synchronized Four getInstance() {
if (INSTANCE == null) {
return new Four();
}
return INSTANCE;
}
}
- 代码实例5:
package com.caocl.designmode.singletonMode;
/**
* lazy loading
* 也称懒汉式
* 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
* 可以通过synchronized加锁解决,但是会降低效率
* 将锁方法改为锁代码块的方式,试图解决降低效率的弊端
* 但是又导致了线程不安全的弊端
*/
public class Five {
private static Five INSTANCE;
private Five() {}
public static Five getInstance() {
if (INSTANCE == null) {
synchronized (Five.class) {
return new Five();
}
}
return INSTANCE;
}
}
- 代码实例6:
package com.caocl.designmode.singletonMode;
/**
* lazy loading
* 也称懒汉式
* 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
* 可以通过synchronized加锁解决,但是会降低效率
* 将锁方法改为锁代码块的方式,试图解决降低效率的弊端
* 但是又导致了线程不安全的弊端
* 为了解决这个问题,提出了双重判断的机制
*/
public class Six {
private static volatile Six INSTANCE;
private Six() {}
public static Six getInstance() {
if (INSTANCE == null) {
synchronized (Six.class) {
if (INSTANCE == null) {
return new Six();
}
}
}
return INSTANCE;
}
}
- 代码实例7:
package com.caocl.designmode.singletonMode;
/**
* 静态内部类方式
* JVM保证单例
* 加载外部类时不会加载内部类,这样可以实现懒加载
*/
public class Seven {
private Seven () {}
private static class SevenHolder {
private final static Seven INSTANCE = new Seven();
}
public static Seven getInstance() {
return SevenHolder.INSTANCE;
}
}
- 代码实例8: 最优雅最完美的设计
package com.caocl.designmode.singletonMode;
/**
* 不仅可以解决线程同步,还可以防止反序列化
*/
public enum Eight {
INSTANCE;
public void m() {
// 业务代码
}
}