单例Bean

本文详细介绍了Java中单例模式的实现方法,包括普通单例、懒汉式单例、饿汉式单例、双重检查锁定和静态内部类等,并通过实例展示了如何在实际开发中应用这些模式,以及如何进行性能优化。

代码:

public class Singleton {
	//私有化构造器
	private Singleton(){
	}
	//单例缓存者,惰性初始化,第一次使用时初始化
	private static class InstanceHolder
	{
		private static final Singleton INSTANCE = new Singleton();
	}
	//提供全局访问点
	public static Singleton getInstance(){
		return InstanceHolder.INSTANCE;
	}
	//提供一个计数器来验证一个ClassLoader一个实例
	private int counter=0;
}

首先私有化构造器,其次使用InstanceHolder静态内部类持有单例对象,这样可以得到惰性初始化好处。最后提供全局访问点getInstance.使得需要该单例实例的对象能够获取到。
Bean 常见问题及解决办法如下: ### Bean 中使用多 Bean 的问题及解决办法 在 Bean 中使用多 Bean 时,由于 Bean 只会创建一次,直接使用多 Bean 无法达到每次使用时都获取新实的效果。可以通过以下三种方式解决:可参考案源码,链接为:https://pan.baidu.com/s/1p6rcfKOeWQIVkuhVybzZmQ ,提取码:zr99 [^1]。 ### Bean 的多线程并发安全问题及解决办法 在 Spring 框架里, Bean 是常见的 Bean 作用域类型,但在多线程场景下可能产生并发安全问题。解决办法如下: - **同步机制**:通过对象的锁机制保证同一时间只有一个线程访问变量。不过使用同步机制要求程序缜密地分析变量读写、对象锁定和释放等繁杂问题,程序设计和编写难度相对较大 [^4]。 - **ThreadLocal**:为每一个线程提供一个独立的变量副本,从而隔离多个线程对数据的访问冲突。不同线程只操作自己线程的副本变量,提供了线程安全的共享对象。可以把不安全的变量封装进 ThreadLocal [^4]。 ```java private static ThreadLocal<Integer> content = new ThreadLocal<Integer>() { protected Integer initialValue() { return (int) (Math.random() * 10 + 100); } }; private static ThreadLocal<Integer> test = new ThreadLocal<Integer>() { protected Integer initialValue() { return (int) (Math.random() * 10 + 100); } }; public Object get() { System.out.println(content.get()); System.out.println(test.get()); System.out.println(); return test.get(); } ``` - **改变 Bean 作用域**:将有状态的 Bean 的作用域由“singleton”改为“prototype”,如使用注解 `@Scope("prototype")` [^4]。 ### Bean 创建过程中的循环引用问题及解决办法 在 Bean 创建过程中,当满足、允许循环依赖且当前 Bean 正在创建中这些条件时,会提前曝光 `beanName` 的 `ObjectFactory` 用于解决循环引用。在 `doCreateBean` 方法中,创建完 Bean后,会调用 `addSingletonFactory` 方法,并重写 `getObject` 方法 [^3]。 ```java protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { // 创建bean instanceWrapper = createBeanInstance(beanName, mbd, args); // 判断是否需要提早曝光实 && 允许循环依赖 && 当前bean正在创建中 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isDebugEnabled()) { logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references"); } // 提前曝光beanName的ObjectFactory,用于解决循环引用 addSingletonFactory(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { // 应用后置处理器SmartInstantiationAwareBeanPostProcessor,允许返回指定bean的早期引用,若没有则直接返回bean return getEarlyBeanReference(beanName, mbd, bean); } }); } // 省略 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值