初学单例模式
单例模式的作用
就是只能创建一个对象
1.饿汉式(线程安全,因为太饿了,开始就要创建对象)
1 package com.xasxt.dao; 2 public class Singleton2 { 3 //第一步:开始就创建私有的,静态的对象 4 private static Singleton2 instance = new Singleton2(); 5 6 //第二步:私有化构造器 7 private Singleton2(){} 8 9 //第三步:静态,返回值是当前类的方法 10 public static Singleton2 getInstance(){ 11 return instance; 12 } 13 }
2.饿汉式之静态代码块(线程安全)
1 package com.xasxt.dao; 2 public class Singleton5 { 3 //第一步:创建一个私有的,静态的对象 4 private static Singleton5 instance ; 5 //第二步:在静态代码块中给对象赋初值 6 static { 7 instance = new Singleton5(); 8 } 9 //第三步:私有化构造器 10 private Singleton5(){}; 11 12 //第四部:创建一个静态的,返回值是当前类的方法 13 public static Singleton5 getInstance(){ 14 return instance; 15 } 16 }
3.懒汉式(线程不安全)
1 package com.xasxt.dao; 2 3 public class Singleton { 4 //第一步:创建一个私有的静态的变量 5 private static Singleton instance; 6 7 //第二步:构造器私有化 8 private Singleton(){} 9 10 //第三步:创建一个公共的、静态的、返回值为当前类的方法 11 public static Singleton getInstance(){ 12 if(instance == null){ 13 instance = new Singleton(); 14 } 15 return instance; 16 } 17 }
4.懒汉式之同步方法锁(加锁之后,线程安全)
1 package com.xasxt.dao; 2 3 public class Singleton3 { 4 //创建一个私有的,静态的对象 5 private static Singleton3 instance; 6 7 //第二步:构造器私有化 8 private Singleton3(){}; 9 10 //第三步:创建一个公共的、静态的、返回值为当前类并且加锁(synchronized)的方法 11 public static synchronized Singleton3 getInstacne(){ 12 if(instance == null){ 13 instance = new Singleton3(); 14 } 15 return instance; 16 } 17 18 }
5.单例模式之双重校验锁(线程安全)
1 package com.xasxt.dao; 2 public class Singleton6 { 3 //第一步:创建一个有volatile修饰符的变量 4 private static volatile Singleton6 instance; 5 6 //第二步:构造器私有化 7 private Singleton6(){}; 8 9 //第三步:创建一个公共的、静态的、返回值为当前类的方法 10 public static Singleton6 getInstance(){ 11 if(instance == null){ 12 //第一次判断之后加锁 13 synchronized (Singleton6.class){ 14 if(instance == null){ 15 //第二次判断之后赋值 16 instance = new Singleton6(); 17 } 18 } 19 } 20 return instance; 21 } 22 }
6.单例模式之静态内部类(线程安全)
1 package com.xasxt.dao; 2 3 public class Singleton7 { 4 //第一步:创建私有的静态内部类 5 private static class s { 6 7 //第二步,在内部类中实例化对象,变量必须是final修饰 8 private static final Singleton7 instnce = new Singleton7(); 9 } 10 //第三步:构造器私有化 11 private Singleton7(){}; 12 13 //第四步:创建一个final修饰的方法 14 public static final Singleton7 getInstnce(){ 15 16 //第五步:通过内部类名调用方法 17 return s.instnce; 18 } 19 }