黃岡商城網(wǎng)站制作哪家好海南快速seo排名優(yōu)化
Spring如何處理線程并發(fā)問題?
-
在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因?yàn)镾pring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進(jìn)行處理,解決線程安全問題。
-
ThreadLocal和線程同步機(jī)制都是為了解決多線程中相同變量的訪問沖突問題。同步機(jī)制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊(duì)。而ThreadLocal采用了“空間換時間”的方式。
-
ThreadLocal會為每一個線程提供一個獨(dú)立的變量副本,從而隔離了多個線程對數(shù)據(jù)的訪問沖突。因?yàn)槊恳粋€線程都擁有自己的變量副本,從而也就沒有必要對該變量進(jìn)行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進(jìn)ThreadLocal。
1
2 /***
6 * 單例Bean的情況
7 * 如果在類中聲明成員變量 并且有讀寫操作(有狀態(tài)),就是線程不安全
8 * 解決:
9 * 1.設(shè)置為多例
10 * 2.將成員變量放在ThreadLocal
11 * 3.同步鎖 會影響服務(wù)器吞吐量
12 * 但是!
13 * 只需要把成員變量聲明在方法中(無狀態(tài)), 單例Bean是線程安全的
14 */
15