1.数据结构:
栈,先进先出的一种数据结构
堆,二叉堆类似于二叉树,特点:根节点的值最小(或最大),且根节点的两个子树也是一个堆
2.内存分配
栈,由操作系统自动分配释放
堆,由程序员分配和释放,若程序不释放,结束后可能由OS回收,分配方法类似于链表
3.缓存级别
栈:1级缓存
堆:2级缓存
1.数据结构:
栈,先进先出的一种数据结构
堆,二叉堆类似于二叉树,特点:根节点的值最小(或最大),且根节点的两个子树也是一个堆
2.内存分配
栈,由操作系统自动分配释放
堆,由程序员分配和释放,若程序不释放,结束后可能由OS回收,分配方法类似于链表
3.缓存级别
栈:1级缓存
堆:2级缓存
1.属于不同的类;sleep属于Thread类中的静态方法;wait属于Object类
2.是否释放锁;sleep不会释放锁;wait方法释放对象锁
3.使用位置;sleep可以在任何地方使用;wait只能在同步方法和同步代码块中使用
4.线程状态;sleep使线程进入阻塞状态;wait方法使线程进入等待队列,使用notify()、notifyAll()或等待制定时间来唤醒当前线程
5.异常捕获;sleep必须捕获异常,sleep过程中可能被其他对象调用的interrupt()从而产生interruptedException,如果不捕获,线程会异常终止,进入终止状态
1.来源:synchironized是java的一个关键字;Lock是一个接口
2.异常是否释放锁:synchronized异常会释放锁,因此不会死锁;Lock必须手动释放锁
3.是否响应中断:synchronized只能等待锁释放;Lock可以用interrupt来中断
4.是否知道锁状态:synchronized不能获取到;Lock可以通过tryLock来知道
5.可重入:Lock可以通过ReadWriteLock来实现可重入锁
6.性能:竞争不激烈,两者性能差不多;竞争激烈Lock大于Sync
7.调度上:sync使用object的wait、notify、notifyall等调度;Lock使用condition进行调度
synchronized和lock的用法区别
synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
synchironized实现原理
1.同步方法:采用ACC_SYNCHRONIZED标记符来实现同步
方法级的同步是隐式的,同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。当某个线程要访问这个方法时,会检查是否有这个标志,
2.作用在代码块:采用monitorenter和monitorexit两个指令实现同步
<JAVA_HOME>/lib
<JAVA_HOME>/lib/ext
<ClassPath>
TODO
用户使用注解或XML方式编写注册Bean
Spring通过BeanDefinitionReader将Bean解析成BeanDefinition BeanDefinitionRegistry.registry注入容器?只注入几个Loader?
执行位置
org.springframework.boot.SpringApplication#run(java.lang.Class<?>, java.lang.String…)
->
org.springframework.boot.SpringApplication#run(java.lang.Class<?>[], java.lang.String[])
->
org.springframework.boot.SpringApplication#run(java.lang.String…)
org.springframework.boot.SpringApplication#prepareContext
pringframework.boot.SpringApplication#load
1 | /** |
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
1 | @Override |
GroovyBeanDefinitionReader, PropertiesBeanDefinitionReader, XmlBeanDefinitionReader会进行调用loadBeanDefinitions,AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader接口,因为AnnotatedBeanDefinitionReader没有必要解析Spring的Resource类型,只要扫描jar包的class文件就可以
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.support.EncodedResource)
1 | /** |
都是IOC容器创建调用refresh接口
都调用到invokeBeanFactoryPostProcessors(beanFactory)方法
从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。
依次触发所有的postProcessBeanDefinitionRegistry()
再触发postProcessBeanFactory()方法BeanFactoryPostProcessor
因此优先于BeanFactoryPostProcessor
1 | while (reiterate) { |
再从容器中找到BeanFactoryPostProcessor组件,然后依次触发postProcessorBeanFactory()方法
1 | public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { |
对BeanFactory本身的设置(BeanFactory的后置处理器)
在BeanFactory标准初始化之后
调用。所有的BeanDefinition已保存加载到BeanFactory中,但Bean Instance仍未创建
时机:IOC容器创建对象 invokeBeanFactoryPostProcessors(beanFactory)
如何找到所有的BeanFactoryPostProcessor并执行他们的方法
初始化创建其他組件
前面执行1 | @FunctionalInterface |
1 | @FunctionalInterface |
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
EnvironmentAware
EmbeddedValueResolverAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware
ApplicationStartupAware
ServletContextAware
LoadTimeWeaverAware
ImportAware
Bean后置处理器,Bean对象创建初始化前后
进行拦截工作的
解析自定义注解
Spring对BeanPostProcessor使用
1 | public interface BeanPostProcessor { |
org.springframework.context.support.AbstractApplicationContext#refresh
org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
—>
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
1 | try { |
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
1 | protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { |
其他 Bean 和进行其他的的上下文初始化
实例化剩余的 Bean 单例