一.懒汉模式
1 /**
2 * 懒汉模式:非线程安全的
3 * 所谓懒汉即用到的时候才初始化
4 */
5 public class SingleTon {
6 //实例成员私有化,防止被引用;设置为null,延迟加载
7 private static SingleTon singleTon = null;
8 //构造器私有化,只有通过getInstance来获取实例
9 public static SingleTon getInstance(){
10 if(singleTon == null){
11 singleTon = new SingleTon();
12 }
13 return singleTon;
14 }
15 //构造器私有化,防止被实例化
16 private SingleTon(){
17
18 }
19
20 public static void main(String[] args) {
21 SingleTon singleTon1 = SingleTon.getInstance();
22 SingleTon singleTon2 = SingleTon.getInstance();
23 System.out.println(singleTon1==singleTon2);//true
24 }
25 }
二.饿汉模式
1 /**
2 * 饿汉模式:线程安全
3 */
4 public class SingleTon {
5 private static final SingleTon singleTon = new SingleTon();
6 public static SingleTon getInstance(){
7 return singleTon;
8 }
9 private SingleTon(){
10
11 }
12 public static void main(String[] args) {
13 SingleTon singleTon1 = SingleTon.getInstance();
14 SingleTon singleTon2 = SingleTon.getInstance();
15 System.out.println(singleTon1==singleTon2);//true
16 }
17 }
三.双重锁
1 /**
2 * 双重锁:懒汉模式的同步优化,线程安全
3 */
4 public class SingleTon {
5 private static SingleTon singleTon = null;
6 public static SingleTon getInstance(){
7 if(singleTon == null){
8 synchronized (SingleTon.class) {
9 if(singleTon==null){
10 singleTon = new SingleTon();
11 }
12 }
13 }
14 return singleTon;
15 }
16 private SingleTon(){
17
18 }
19 public static void main(String[] args) {
20 SingleTon singleTon1 = SingleTon.getInstance();
21 SingleTon singleTon2 = SingleTon.getInstance();
22 System.out.println(singleTon1==singleTon2);//true
23 }
24 }
四.静态内部类
1 /**
2 * 静态内部类:线程安全
3 */
4 public class SingleTon {
5 private static class SingleTonHolder{
6 private static SingleTon singleTon = new SingleTon();
7 }
8 public static SingleTon getInstance(){
9 return SingleTonHolder.singleTon;
10 }
11 private SingleTon(){
12 }
13 public static void main(String[] args) {
14 SingleTon singleTon1 = SingleTon.getInstance();
15 SingleTon singleTon2 = SingleTon.getInstance();
16 System.out.println(singleTon1==singleTon2);//true
17 }
18 }
总结:单线程模式下用第一种就行,多线程下最好用第二种或第四种。因为网上很多人说第二种也没有做到线程安全。