由于指令重排的存在,可能出现132的顺序,多线程环境下,可能出现 instance != null 但是初始化工作还没完成的情况在占有锁的线程没有完成初始化时,另一个线程认为以及初始化完毕了去使用对象的时候便会有问题
加上 volatile 关键字就可以解决指令重排的问题
JVM内存泄漏情景类似于栈,内存的管理权不属于JVM而属于栈本身,所有被pop掉的index上还存在着过期的引用Stack.pop()的源码中手动清除了过期引用
elementData[elementCount] = null; /* to let gc do its work
将对象引用放入了缓存,可以用WeakHashMap作为引用外键
监听器和其他回调,可以用WeakHashMap作为引用外键
JavaEE Spring 什么是IoC和DIIoC(控制反转),控制反转是把传统上由程序代码直接操控的对象的调用权交给IoC容器,通过IoC容器来实现对象组件的依赖注入,依赖检查,自动装配等对象生命周期管理
DI(依赖注入)主要是遵循设计模式中依赖倒转原则中的“高层模块不应该依赖底层模块,两个都应该抽象依赖”,依赖注入的方式主要包括,setter方法,interface接口,constructor构造函数,annotation注解
BeanFactory和ApplicationContextBeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器,ApplicationContext是BeanFactory的子接口
BeanFactory
是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系
BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化
ApplicationContext
ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能
继承MessageSource,因此支持国际化。
统一的资源文件访问方式。
提供在监听器中注册bean的事件。
同时加载多个配置文件。
载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
在容器启动时,一次性创建了所有的Bean
Bean的五种作用域singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例