對於Map、Spring、Mybatis、ThreadLocal的一些理解

  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: 通過爲每一個使用它的線程提供一個獨立的變量副本來實現,這樣多線程併發操作時相互之間就不會受到影響了;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章