程序中只需要创建某个类的一个实例,用到单例模式。
应用场景:Runtime类、数据库连接池、日志管理(例如:log4j)
实现原理:一个类,内部定义了该类的静态变量,并且定义了获取该静态变量的静态方法;构造函数的访问权限定义为 private;
饿汉式单例模式:(类加载时被创建)
1 public class Singleton { 2 private static Singleton instance = new Singleton(); 3 private Singleton(){ // 访问权限 私有 是为了 防止类外通过构造函数获取该类的实例 4 ... 5 } 6 public static Singleton getInstance (){ 7 return instance; 8 } 9 10 }
懒汉式单例模式:(需要获取时才进行创建)
1 public class Singleton { 2 private static Singleton instance = null; 3 private Singleton(){ // 访问权限 私有 是为了 防止类外通过构造函数获取该类的实例 4 ... 5 } 6 public static Singleton getInstance (){ 7 if(instance == null){ 8 instance = new Singleton(); 9 } 10 return instance; 11 } 12 13 }
懒汉式单例模式在单线程下没什么问题,但是在多线程下会创建 多个实例。与单例模式的初衷相悖,所以有了 双检索机制的 懒汉式单例模式。
双检索机制的懒汉式单例模式:
1 public class Singleton { 2 private static Singleton instance = null; 3 private Singleton(){ 4 ...; 5 } 6 public static Singleton getInstance(){ 7 if( instance == null ){ 8 synchronized ( Singleton.class) { // 增加同步机制 9 if( instance == null ) { 10 instance = new Singleton(); 11 } 12 } 13 } 14 } 15 }
时间: 2024-10-06 16:26:32