Java-基本语法回顾总结[37-48]

dengliang356a / 2023-07-05 / 原文

  1. ReentrantLock与synchronized的区别?-√
  2. 含义:ReentrantLock是一个类;synchronized是一个关键字
    是否公平:ReentrantLock可以加公平锁,也可以加非公平锁;synchronized只能是非公平锁。
    synchronized自动加锁释放锁,ReentrantLock需要手动加锁释放锁
    synchronized是JVM层面的锁,ReentrantLock是API层面的锁
    
  3. 对AQS的理解,AQS如何实现可重入锁-※
  4. AQS是一个用于JAVA线程同步的框架。
    AQS内部维护了一个状态变量state和一个线程双向队列。
    在可重入锁的场景下,state表示加锁次数,当state减少至0时,代表持有锁的线程释放锁了,就唤醒下一个线程竞争锁。
    
  5. 对IOC的理解
  6. inverse of control,控制翻转,将bean的生成交给spring管理,例如,@autowired自动装配的mapper层对象。
    好处:单例bean可以有效复用,减少对象生成的时间成本。各种bean还有自身的应用场景。
    
  7. 单例bean与单例模式
  8. spring自动装配出来的对象全都会指向同一个单例bean,不强制约束用户不可创建第二个对象。
    单例模式针对的是类而言的,如果某个类应用了单例模式,那么这个类就不可能创建出第二个对象,所有该类的引用都会指向同一个对象,不管是spring自动装配还是用户自己new。
    
  9. spring事务传播机制-※
  10. spring事务什么时候会失效-√
  11. 数据库:数据库如果不支持事务,那么spring事务就会失效
    Java:
    类:事务所在类没有对应的注解,spring没有在容器里面生成该类的bean[类上面没有component之类的注解]
    方法:方法上没有加上事务注解或者方法的权限修饰符不是public
    调用:调用方法没有使用代理对象,而是通过原对象调用的方法。[自己new]
    
  12. spring中创建的bean,生命周期有哪些-※
  13. 1.推断构造方法
    2.实例化
    3.依赖注入[构造方法可能需要部分外部注入属性;成员变量中依赖于其他类,等等多种需要将其他实例注入的情况]
    4.处理@postConstruct注解,构造之后还可以执行的自定义处理
    5.处理initializingBean接口复写内容,如果实现了该接口的话[前面就是bean的实例化,这一步就是bean的初始化,这就是两者的区别]
    6.生成代理对象,最后生成bean
    
  14. spring中的bean是线程安全的吗?
  15. 如果bean上有状态,就不是线程安全的
    如果bean上没有状态,就是线程安全的
  16. applicationContext和beanFactory有什么区别?
  17. beanFatory的功能,applicationContext都有,但applicationContext还有其他功能[获取系统环境变量、事件发布]
  18. spring中的事务是如何实现的?-※
  19. @Transactional什么时候会失效?
  20. 类:事务所在类没有对应的注解,spring没有在容器里面生成该类的bean
    方法:方法上没有加上事务注解或者方法的权限修饰符不是公共的
    调用:调用方法没有使用代理对象,而是通过原对象调用的方法。
    
  21. spring容器的启动流程是怎样的?-※
  22. 1.扫描所有beanDefinition对象,并保存至map
    2.筛选出单例bean进行bean创建,推断构造方法-实例化-依赖注入-postConstruct注解-beanInition接口复写方法-生成代理对象-生成bean
    3.applicationContext发布spring容器启动事件