- Map:
- ConcurrenHashMap:
- 分段鎖策略;
- 一個ConcurrentHashMap中維護一個segment的數組,segment繼承了ReentrantLock,保證線程安全;
- 每個segment就是一個子哈希表,哈希表中通過synchronized保證線程安全;
- 因此,多線程情況下可以同時對多個segment操作而保證線程安全,同時提高效率;
- HashTable:
- 只有一個哈希表,使用synchronized保證線程安全,所以效率較低;
- HashMap:
- 線程不安全原因:多線程情況下,當一個線程put到臨界容量擴容的過程中,另一個線程也進行put,會出現hash值相同的情況,會用鏈表處理,這樣會形成閉環,這樣在get時會產生死循環,大量消耗cpu資源;
- ReentrantLock的底層實現:CAS(見名知意);
- ConcurrenHashMap:
- Spring:
- Spring核心 IOC 和 AOP;
- IOC:控制反轉;
- 表象:由new對象變成DI(依賴注入);
- 依賴注入的方式:
- 構造注入:在對象構造的過程中,IOC service provider檢測其依賴對象進行注入,如果依賴過多,維護起來可能比較麻煩;
- set注入:可以在構造完成後注入,比較靈活;
- 接口注入:接口注入必須有實現類;
- 依賴注入的方式:
- 實質:依賴關係的反轉:
- 以前是上層依賴下層,父類依賴子類,如果子類對象要擴展功能會影響到其所有父類;
- 控制反轉是要使下層依賴上層,子類依賴父類,由父類規定依賴的子類是誰,但是子類的變化不會影響到父類;
- 表象:由new對象變成DI(依賴注入);
- AOP:面向切面編程:
- 在無干擾的情況下實現業務功能的擴展;
- 原理:動態代理:通過反射在程序運行過程中動態的生成代理類;
- 接口方式實現:jdk提供:
- 通過反射獲取接口然後獲取接口實現類生成動態代理類;
- 必須有接口,必須有接口的實現類,相比cjlib效率較低;
- 繼承的方式實現:cjlib提供:
- 通過反射生成當前類的子類,然後在子類中實現代理擴展功能;
- 無需接口,比較靈活,性能較好;
- 接口方式實現:jdk提供:
- Mysql聯合索引:最左前綴原則:與最左邊字段結合的索引都生效;
- Mybatis:過程大概:
- 通過讀取配置文件生成SqlSessionFactory,由SqlSessionFactory生成Sqlsession;
- 通過Mapper.xml生成MapperStatement;
- sqlsession根據mapperId調用MapperStatement完成CURD;
- ThreadLocal: 通過爲每一個使用它的線程提供一個獨立的變量副本來實現,這樣多線程併發操作時相互之間就不會受到影響了;