1、饿汉式
- 私有化构造方法
- 创建一个对象,这个对象是被 private static final 修饰
- 向外创建一个静态方法,返回这个实例。
package singleton;
/**
* 单例模式:饿汉式,最为简单的写法同时也是使用最多的
*
*/
public class Demo{
private Demo(){}
private static final Demo demo= new Demo();
public static Demo getInstance(){
return demo;
}
}
2、懒汉式(升级版)
-
私有化构造方法
-
创建静态内部类
-
编写向外提供单例的方法(方法中直接返回静态类的私有化成员对象)
package singleton;
/**
* 迄今为止最安全的懒加载
* 线程安全由jvm保证,因为jvm只对类加载一次
* 其中的静态内部类是当使用getInstance方法的时候才加载
*/
public class Lanhanshi {
private Lanhanshi(){
}
private static class LanhanshiHander{
private static final Lanhanshi lanhanshi = new Lanhanshi();
}
public static Lanhanshi getInstance() {
return LanhanshiHander.lanhanshi;
}
public static void main(String[] args) {
Lanhanshi instance = Lanhanshi.getInstance();
Lanhanshi instance2 = Lanhanshi.getInstance();
System.out.println(instance==instance2);
new Thread(()-> {
for (int i = 0; i < 100; i++) {
System.out.println(Lanhanshi.getInstance());
}
}).start();
}
}
3、枚举方法创建单例
package singleton;
/**
* 在effect java中,推荐使用枚举单例,不仅线程安全,还可以防止序列化
*
*/
public enum EnumSingle {
INSTANCE;
public void EnumSingle(){}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
System.out.println(EnumSingle.INSTANCE.hashCode());
}).start();
}
}
}
打印结果
提示:枚举类没有构造方法。