JAVA设计模式(单例模式)

本文详细介绍了单例模式的实现方式,包括懒汉式线程安全与不安全、饿汉式及其变种、枚举、静态内部类及双重校验锁等,并提供了每种方式的具体代码示例。
一、概述

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。它的具体实现:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

二、代码

1、懒汉式 线程安全
/*
* 懒汉式,也是常用的形式。
*/
public class SingletonClass {
	private static SingletonClass mSingletonClass;
	private SingletonClass(){
	}
	public static synchronized SingletonClass newInstance(){
		if(mSingletonClass == null){
			mSingletonClass = new SingletonClass();
		}
		return mSingletonClass;
	}
}

2、懒汉式 线程不安全
/*
* 懒汉式,也是常用的形式。
*/
public class SingletonClass {
	private static SingletonClass mSingletonClass;
	private SingletonClass(){
	}
	public static SingletonClass newInstance(){
		if(mSingletonClass == null){
			mSingletonClass = new SingletonClass();
		}
		return mSingletonClass;
	}
}


3、饿汉式
/*饿汉式*/
public class SingletonClass{
    
    private static final SingletonClass mSingletonClass = new SingletonClass();
    private SingletonClass(){
        
    }
    public static SingletonClass newInstance(){
        return mSingletonClass;
    }
}


4、饿汉式 变种
/*饿汉式 变种*/
public class SingletonClass{
    private SingletonClass mSingletonClass = null;
    static {
        mSingletonClass = new SingletonClass();
    }
    private SingletonClass(){
        
    }
    public static SingletonClass newInstance(){
        return this.mSingletonClass;
    }
}


5、枚举
/*枚举*/
public enum SingletonClass {
	INSTANCE;
}



6、静态内部类
/*静态内部类*/
public class SingletonClass {
	private static class SingletonHoder{
		private static final SingletonClass INSTACE = new SingletonClass();
	}
	
	public static final SingletonClass newInstance(){
		return SingletonHoder.INSTACE;
	}
}


7、双重校验锁
/*双重校验锁*/
public class SingletonClass {
	private static volatile SingletonClass mSingletonClass;
	private SingletonClass(){
		
	}
	public SingletonClass newInstance(){
		if(mSingletonClass == null){
			synchronized (SingletonClass.class) {
				mSingletonClass = new SingletonClass();
			}
		}
		return mSingletonClass;
	}
}



对于各种方法的比较更详细的描述: http://cantellow.iteye.com/blog/838473
### Java 中的单例模式设计与实现 #### 单例模式的概念 单例模式是一种创建型设计模式,它确保某个类只有一个实例存在,并提供全局访问点来获取该实例。这种模式特别适用于那些只需要单一控制中心的应用场景。 #### 实现方式 ##### 饿汉式(Eager Initialization) 饿汉式的优点在于简单易懂,在类加载时就完成了初始化工作,因此不存在线程安全问题。 ```java public class EagerInitializedSingleton { private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); private EagerInitializedSingleton() {} public static EagerInitializedSingleton getInstance() { return instance; } } ``` ##### 懒汉式(Lazy Initialization) 懒汉式是在第一次调用 `getInstance()` 方法时才去创建对象,可以节省资源开销,但是需要考虑多线程环境下的安全性[^2]。 ```java public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} synchronized public static LazyInitializedSingleton getInstance() { if (instance == null) { instance = new LazyInitializedSingleton(); } return instance; } } ``` 为了提高性能并保持线程安全,通常会采用双重校验锁的方式优化懒汉式实现: ```java public class DoubleCheckedLockingSingleton { private volatile static DoubleCheckedLockingSingleton uniqueInstance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (uniqueInstance == null) { // First check before locking synchronized (DoubleCheckedLockingSingleton.class) { if (uniqueInstance == null) { // Second check after acquiring lock uniqueInstance = new DoubleCheckedLockingSingleton(); } } } return uniqueInstance; } } ``` ##### 枚举类型 枚举类型的实现不仅简洁而且天然具备序列化机制以及防止反序列化的特性,是最推荐的一种实现方法。 ```java public enum EnumSingleton { INSTANCE; public void someMethod(){ } } ``` ##### 内部静态辅助类法(Bill Pugh Singleton Implementation) 这种方法利用了JVM对于内部类加载的特点,既实现了延迟加载又解决了线程同步的问题。 ```java public class BillPughSingleton { private BillPughSingleton(){} private static class SingletonHelper{ private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHolder.INSTANCE; } } ``` #### 使用案例 `java.lang.Runtime` 是 JDK 自带的一个典型应用例子,通过其唯一的运行时表示当前 JVM 的运行状态,并提供了许多有用的工具函数给开发者使用。可以通过 `getRuntime().availableProcessors()` 获取处理器数量等操作[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值