package com.liuyc.designpattern.singleton;
/**
* 懒汉模式
*/
public class SingletonDemo1 {
private static volatile SingletonDemo1 singletonDemo1;
/**
* 构造方法设置为私有,使其不能被外部代码实例化
*/
private SingletonDemo1(){}
/**
* 提供获取实例方法
* @return
*/
public static SingletonDemo1 getSingletonDemo1() {
//已实例化对象,则不用进行加锁解锁,提升代码执行性能。
if(singletonDemo1 == null){
//多线并发下加锁防止重复执行创建对象,配合变量Volatile防止构造对象指令与给singletonDemo1引用变量赋值指令重排
synchronized (SingletonDemo1.class){
if(singletonDemo1 == null){
singletonDemo1 = new SingletonDemo1();
}
}
}
return singletonDemo1;
}
}
package com.liuyc.designpattern.singleton;
/**
* 使用内部静态类实现懒汉式单例模式
*/
public class SingletonDemo2 {
private SingletonDemo2(){}
/**
* 外部加载时,静态内部不会立即加载,当需要使用到静态内部类时才会被加载。
*/
private static class SingletonInterior{
private static final SingletonDemo2 singletonDemo2 = new SingletonDemo2();
}
public static SingletonDemo2 getSingletonDemo2(){
return SingletonInterior.singletonDemo2;
}
}
package com.liuyc.designpattern.singleton;
/**
* 使用枚举实现单例模式,可以做到反序列化
*/
public enum SingletonDemo3 {
SINGLETONDEMO3;
public static void main(String[] args) {
System.out.println(SingletonDemo3.SINGLETONDEMO3);
}
}
package com.liuyc.designpattern.singleton;
/**
* 饿汉模式
*/
public class SingletonDemo4 {
/**
* 做成类变量,在类加载时实例化对象,同时由类加载机制保证了绝对线程安全。
*/
private static final SingletonDemo4 singletonDemo4 = new SingletonDemo4();
/**
* 构造方法设置为私有,使其不能被外部代码实例化
*/
private SingletonDemo4(){}
/**
* 提供对外获取实例方法
* @return
*/
public static SingletonDemo4 getSingletonDemo4() {
return singletonDemo4;
}
}