1. 程式人生 > >Spring 使用ThreadLocal 解決執行緒安全問題

Spring 使用ThreadLocal 解決執行緒安全問題

Spring 中的 一些bean, 如 RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等非執行緒安全的“狀態性物件”採用ThreadLocal進行封裝,讓他們也稱為執行緒安全的“狀態性物件”,因此有狀態的bean就能夠以singleton的方式在多執行緒環境中正常工作。

一般的Web應用劃分為展現層、服務層 和 持久層2個層次,在不同的層中編寫對應的邏輯,下層通過介面向上層開放功能呼叫。在一般情況下,從接收請求到返回響應所經過的所有程式都同屬一個執行緒,如下圖所示:

這樣使用者就可以根據需要,將一些非 執行緒安全的變數以 ThreadLocal存放,在同一次請求響應的呼叫執行緒中,所有物件所訪問的同一ThreadLocal變數都是當前執行緒所繫結的。