base - 对于Map、Spring、Mybatis、ThreadLocal的一些理解

145 阅读2分钟
  1. Map:

    1. ConcurrenHashMap:

      1. 分段锁策略;
      2. 一个ConcurrentHashMap中维护一个segment的数组,segment继承了ReentrantLock,保证线程安全;
      3. 每个segment就是一个子哈希表,哈希表中通过synchronized保证线程安全;
      4. 因此,多线程情况下可以同时对多个segment操作而保证线程安全,同时提高效率;
    2. HashTable:

      1. 只有一个哈希表,使用synchronized保证线程安全,所以效率较低;
    3. HashMap:

      1. 线程不安全原因:多线程情况下,当一个线程put到临界容量扩容的过程中,另一个线程也进行put,会出现hash值相同的情况,会用链表处理,这样会形成闭环,这样在get时会产生死循环,大量消耗cpu资源;
    4. ReentrantLock的底层实现:CAS(见名知意);

  2. Spring:

    1. Spring核心 IOC 和 AOP;

    2. IOC:控制反转;

      1. 表象:由new对象变成DI(依赖注入);

        1. 依赖注入的方式:

          1. 构造注入:在对象构造的过程中,IOC service provider检测其依赖对象进行注入,如果依赖过多,维护起来可能比较麻烦;
          2. set注入:可以在构造完成后注入,比较灵活;
          3. 接口注入:接口注入必须有实现类;
      2. 实质:依赖关系的反转:

        1. 以前是上层依赖下层,父类依赖子类,如果子类对象要扩展功能会影响到其所有父类;
        2. 控制反转是要使下层依赖上层,子类依赖父类,由父类规定依赖的子类是谁,但是子类的变化不会影响到父类;
    3. AOP:面向切面编程:

      1. 在无干扰的情况下实现业务功能的扩展;

      2. 原理:动态代理:通过反射在程序运行过程中动态的生成代理类;

        1. 接口方式实现:jdk提供:

          1. 通过反射获取接口然后获取接口实现类生成动态代理类;
          2. 必须有接口,必须有接口的实现类,相比cjlib效率较低;
        2. 继承的方式实现:cjlib提供:

          1. 通过反射生成当前类的子类,然后在子类中实现代理扩展功能;
          2. 无需接口,比较灵活,性能较好;
  3. Mysql联合索引:最左前缀原则:与最左边字段结合的索引都生效;

  4. Mybatis:过程大概:

    1. 通过读取配置文件生成SqlSessionFactory,由SqlSessionFactory生成Sqlsession;
    2. 通过Mapper.xml生成MapperStatement;
    3. sqlsession根据mapperId调用MapperStatement完成CURD;
  5. ThreadLocal: 通过为每一个使用它的线程提供一个独立的变量副本来实现,这样多线程并发操作时相互之间就不会受到影响了;