版权声明:本文为博主原创文章,转载请指明出处: https://blog.csdn.net/qq_34178598/article/details/83374718
前言:单例模式是23种设计模式中最简单的一种,也是笔试面试中最常考察的一种设计模式,所以我们必须掌握它。
1.饿汉(线程安全)
/**
* 饿汉
*
* @author [email protected]
* @date 18-6-14 下午4:52
*/
public class Demo1 {
private static Demo1 demo1 = new Demo1();
private Demo1() {
}
public static Demo1 getInstance() {
return demo1;
}
public static void main(String[] args) {
System.out.println(Demo1.getInstance().hashCode());
System.out.println(Demo1.getInstance().hashCode());
}
}
2.懒汉(线程不安全)
/**
* 懒汉 线程不安全
*
* @author [email protected]
* @date 18-6-14 下午4:53
*/
public class Demo2 {
private static Demo2 demo2 = null;
private Demo2() {
}
public static Demo2 getInstance() {
if (demo2 == null) {
demo2 = new Demo2();
}
return demo2;
}
public static void main(String[] args) {
System.out.println(Demo2.getInstance().hashCode());
System.out.println(Demo2.getInstance().hashCode());
}
}
3.懒汉双重锁验证(线程安全)
/**
* 懒汉2
*
* @author [email protected]
* @date 18-6-14 下午4:55
*/
public class Demo3 {
private static volatile Demo3 demo3 = null;
private Demo3() {
}
public static Demo3 getInstance() {
if (demo3 == null) {
synchronized (Demo3.class) {
if (demo3 == null) {
demo3 = new Demo3();
}
}
}
return demo3;
}
public static void main(String[] args) {
System.out.println(Demo3.getInstance().hashCode());
System.out.println(Demo3.getInstance().hashCode());
}
}
4.静态内部类(线程安全,推荐)
/**静态内部类
* @author [email protected]
* @date 18-6-14 下午4:59
*/
public class Demo4 {
private Demo4() {
}
private static class Demo4Instance {
private static Demo4 demo4 = new Demo4();
}
public static Demo4 getInstance() {
return Demo4Instance.demo4;
}
public static void main(String[] args) {
}
}
由于静态内部类跟外部类是平级的,所以外部类加载的时候不会影响内部类,因此实现了lazy loading;同时也是利用静态变量的方式,使得Demo4只会在Demo4Instance加载的时候初始化一次,从而保证不会有多线程初始化的情况,因此也是线程安全的。
5.枚举(线程安全)
/**枚举
* @author [email protected]
* @date 18-6-14 下午5:02
*/
public enum Demo5 {
getInstance;
private Demo5Instance demo5Instance;
public Demo5Instance getDemo5Instance(){
return demo5Instance;
}
Demo5() { //只初始化一次
demo5Instance = new Demo5Instance();
}
public static void main(String[] args) {
Demo5Instance demo5Instance = Demo5.getInstance.getDemo5Instance();
Demo5Instance demo5Instance2 = Demo5.getInstance.getDemo5Instance();
System.out.println(demo5Instance2.hashCode());
System.out.println(demo5Instance.hashCode());
}
}
class Demo5Instance {
}