商城網(wǎng)站建設(shè)經(jīng)驗(yàn)seo工具軟件
1、ThreadLocal 是什么
是 Java 中線(xiàn)程的本地方法變量,用來(lái)存儲(chǔ)每個(gè)線(xiàn)程的私有數(shù)據(jù),每個(gè)線(xiàn)程都有它的獨(dú)立副本,相互隔離,互不影響
2、ThreadLocal 實(shí)現(xiàn)原理
每個(gè) ThreadLocal 都有一個(gè) ThreadLocalMap 對(duì)象,用來(lái)存儲(chǔ) ThreadLocal 變量和對(duì)應(yīng)的值,通過(guò) ThreadLocal 對(duì)象的 get()、set() 方法訪(fǎng)問(wèn)對(duì)應(yīng)的 ThreadLocalMap 的值
3、ThreadLocal 的使用場(chǎng)景
token 驗(yàn)證之后會(huì)把用戶(hù)相關(guān)的信息存儲(chǔ)在 ThreadLocal 中,方便之后業(yè)務(wù)獲取當(dāng)前業(yè)務(wù)信息
數(shù)據(jù)庫(kù)連接、事務(wù)管理,查日志的記錄
4、ThreadLocal 注意事項(xiàng)
ThreadLocal 是不安全的,存在內(nèi)存泄漏問(wèn)題,當(dāng)一個(gè)線(xiàn)程結(jié)束時(shí),需要手動(dòng)清除對(duì)應(yīng)的 ThreadLocalMap,以避免內(nèi)存泄露問(wèn)題(在線(xiàn)程最后 remove() )
5、ThreadLocal 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):線(xiàn)程安全:他會(huì)建立一個(gè)獨(dú)立的變量副本,確保他們之間互不影響
簡(jiǎn)化編程模型
可以跨層:跨類(lèi)跨方法傳遞變量
數(shù)據(jù)隔離:每個(gè)線(xiàn)程提供單獨(dú)的上下文環(huán)境,方便跨層傳遞,避免參數(shù)傳遞的復(fù)雜性
缺點(diǎn):會(huì)造成內(nèi)存泄漏
6、Spring Boot 如何讀取配置文件
@Value 屬性注入
@ConditionalOnProperty(prefix = "") Java Bean
@PropertySource
7、Spring Boot 配置文件的優(yōu)先級(jí)
file:./config/application.properties 高
file:./application.properties
classpath:/config/application.properties
classpath:/application.properties 低
8、SpringBoot 常用注解
啟動(dòng)層:@SpringBootApplication(總代理)、@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan、@MapperScan("com.by.dao")
controller 層:@RestController、@RequestMapping、@ResponseBody、@AutoWired、@GetMapping、@PostMapping、@PutMapping、@DelectMapping
service 層:@Service
dao 層:@Mapper
@Configuration、@Bean、@Resource、@value、@ConditionalOnProperty
9、常用的日志框架
SLF4j(Simple Logging Facade for Java)門(mén)面模式(抽象層)
Log4j、Log4j2、logback 日志的實(shí)現(xiàn)
10、ELK
是由Elasticsearch (ES):非關(guān)系型數(shù)據(jù)庫(kù)
Logstash (LS):采集器
Kibana (KB):UI 可視化工具
11、EFK
是由Elasticsearch (ES):非關(guān)系型數(shù)據(jù)庫(kù)
Filebeat (LS):采集器
Kibana (KB):UI 可視化工具
Filebeat 相對(duì)于 Logstash 來(lái)說(shuō)更為輕量級(jí),資源消耗較小
12、MDC
其實(shí)就是 ThreadLocal 的升級(jí)版 InheritableThreadLocal ,它不僅繼承了 ThreadLocal 還擴(kuò)展了一些功能,就比如說(shuō)子線(xiàn)程繼承了父線(xiàn)程的 ThreadLocal 的值(簡(jiǎn)單說(shuō)父線(xiàn)程會(huì)將它腦門(mén)上的標(biāo)簽復(fù)制一份給到子線(xiàn)程,讓子線(xiàn)程也可以被 MDC 所訪(fǎng)問(wèn))
對(duì)于 web 應(yīng)用來(lái)說(shuō),會(huì)在請(qǐng)求的最開(kāi)始(在攔截器 Filter)保存這些數(shù)據(jù)
13、InheritableThreadLocal 與ThreadLocal 的區(qū)別
InheritableThreadLocal 繼承了 ThreadLocal 類(lèi),還擴(kuò)展了一些其他的功能
準(zhǔn)確的說(shuō)就是 InheritableThreadLocal 可以讓子線(xiàn)程繼承父線(xiàn)程的 ThreadLocal 的值,ThreadLocal 不可以