一、饿汉式:
/**
* 饿汉式:
* 不存在多线程同步问题,当类被加载时,初始化并分配内存空间;
* 当类被卸载时,才释放所占内存,因此在某些特定条件下会耗费内存。
*
* @author: Rodge
* @time: 2018年10月4日 下午4:35:12
* @version: V1.0.0
*/
public class SingletonTest {
// 定义一个私有构造,防止通过new去实例化
private SingletonTest() {
}
// 将自身实例对象设置为一个属性
private static final SingletonTest singleton = new SingletonTest();
// 静态方法返回该类实例
public static SingletonTest getSingleton() {
return singleton;
}
}
二、懒汉式:
/**
* 懒汉式
*
* @author: Rodge
* @time: 2018年10月4日 下午4:40:43
* @version: V1.0.0
*/
public class SingletonTest {
// 定义一个私有构造,防止通过new去实例化
private SingletonTest() {
}
// 定义一个类型的变量(不初始化,不使用final关键字)
private static SingletonTest singleton;
// 定义一个静态的方法(调用时再初始化,但是多线程访问时,可能造成重复初始化问题)
public static SingletonTest getSingleton() {
if(singleton == null) {
singleton = new SingletonTest();
}
return singleton;
}
}
三、双重校验锁:
/**
* 懒汉式最优方案:线程安全,效率高(双重校验锁)
*
* @author: Rodge
* @time: 2018年10月4日 下午4:44:32
* @version: V1.0.0
*/
public class SingletonTest {
// 定义一个私有构造,防止通过new去实例化
private SingletonTest() {
}
// 使用volatile保证了多线程访问时singleton变量的可见性,
// 避免了初始化时其他变量属性还没赋值完时,被另外线程调用
private static volatile SingletonTest singleton;
// 定义一个静态的方法(调用时再初始化,但是多线程访问时,可能造成重复初始化问题)
public static SingletonTest getSingleton() {
// 先判断,不使用同步代码块,singleton不等于null时,直接返回对象,提高运行效率
if(singleton == null) {
// 同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,
// 不再重复被创建)
synchronized (SingletonTest.class) {
// 未初始化,则初始singleton变量
if(singleton == null) {
singleton = new SingletonTest();
}
}
}
return singleton;
}
}
四、枚举:
/**
* 枚举
*
* @author: Rodge
* @time: 2018年10月4日 下午4:47:56
* @version: V1.0.0
*/
public enum SingletonTest {
INSTANCE;
public void get() {
System.out.println("init...");
}
}
public static void main(String[] args) {
SingletonTest s = SingletonTest.INSTANCE;
s.get();
}
五、静态内部类:
/**
* 静态内部类
*
* @author: Rodge
* @time: 2018年10月4日 下午4:50:28
* @version: V1.0.0
*/
public class SingletonTest {
// 定义一个私有构造,防止通过new去实例化
private SingletonTest() {
}
// 定义静态内部类
private static class Singleton2 {
private static final SingletonTest singleton = new SingletonTest();
}
public static final SingletonTest get() {
return Singleton2.singleton;
}
}