java单例模式实现方法

本文详细介绍了Java中实现单例模式的多种方法,包括饿汉式、懒汉式(静态同步锁、双检查锁、静态内部类)以及枚举方式。此外,还讨论了单例模式可能遇到的问题,如通过反射生成额外实例、多类加载器导致的单例问题以及单例类的序列化处理,并提供了相应的解决方案。
摘要由CSDN通过智能技术生成

 单例(Singleton)是指只实例化一次的类。

 

   一、如何实现单例

   单例类常用的实现方式有以下几种

 

     1、饿汉式:类载入时创建单例实例


     1.1、公开的静态常量单例对象
         

/**
 * *
 * <p>
 * *
 * <h6>当类StaticFinalSingleton类被实例化时,有且仅有一个StaticFinalSingleton实例存在 *
 * (除非客户端通过类反射机制调用该私有的构造方法,否则外部无法改变单例)</h6> * * @Copyright 2011 *
 * </p>
 */
public class StaticFinalSingleton {
 /** * 公有静态常量单例对象 */
 public static final StaticFinalSingleton INSTANCE = new StaticFinalSingleton();

 /** * 私有构造方法 */
 private StaticFinalSingleton() {
 }
}

 
 

 

   1.2、静态工厂方法获取私有静态常量单例对象

/**
 * *
 * <p>
 * *
 * <h6>当类StaticFinalSingleton类被实例化时,有且仅有一个StaticFinalSingleton实例存在 *
 * (除非客户端通过类反射机制调用该私有的构造方法,否则外部无法改变单例)</h6> * * @Copyright 2011 *
 * </p>
 */
public class StaticFinalSingleton {
 /** * 私有静态常量单例对象 */
 private static final StaticFinalSingleton INSTANCE = new StaticFinalSingleton();

 /** * 私有构造方法 */
 private StaticFinalSingleton() {
 }

 /** * 静态工厂方法获取StaticFinalSingleton型的私有静态常量单例对象 */
 public static StaticFinalSingleton getInstanceFactory() {
  return INSTANCE;
 }
}

 

      
     2、懒汉式:延迟加载创建单例实例
      2.1、基于静态同步锁的lazy initialization单例类

     此种方法不常用,因为在实际中会大大影响并发度,性能较差

     

 /**
 * <p>
 * <h6>基于静态同步锁的lazy initialization单例类:<br>
 * 此种方法不常用,因为在实际中会大大影响并发度,并且可能不够安全</h6>
 * 
 * @Copyright 2011
 *            </p>
 */
public class SynLockSingleton {
 /**
  * 私有静态常量单例对象
  */
 private static SynLockSingleton INSTANCE = null;

 /**
  * 私有构造方法
  */
 private SynLockSingleton() {

 }
 /**
  * 返回单例实例
  */
 public static synchronized SynLockSingleton getInstanceFactory() {
  if (INSTANCE == null) {
   INSTANCE = new SynLockSingleton();
  }
  return INSTANCE;
 }
}



 
 

     2.2、基于双检查锁机制的lazy initialization单例类

   双检查锁只有在 jdk 1.5 及以上版本才能达到单例的效果,因此不常用

   

 /**
 * <p>
 * <h6>基于双检查锁机制的lazy initialization单例类:<br>
 * 双检查锁只有在 jdk 1.5 及以上版本才能达到单例的效果,因此不常用</h6>
 * 
 * @Copyright 2011
 *            </p>
 */
public class DCLSingleton {
 
 private static DCLSingleton INSTANCE = null;

 /**
  * 私有构造方法
  */
 private DCLSingleton() {

 }
 /**
  * 返回单例实例
  */
 public static DCLSingleton getInstance() {
  if (INSTANCE == null) {
   synchronized (DCLSingleton.class) {
    if (INSTANCE == null) {
     INSTANCE = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值