一。首先spring中的bean是線程不安全的
spring的作用域大致可以分為兩種,一種是單例模式,一種是原型模式
在單例模式中bean只會被ioc容器初始化一次(當然講到單例模式自然既有飽和餓漢的方法),但不管咋樣就是線程不安全的,因為ioc容器只初始化一次
將數據就加載到JVM內存當中,但是我們知道在多線程的情況下,用戶是會公用一個bean的應為是單例模式的,這樣就會產生線程不安全的問題,線程不安全
的最基本含義就是信息不共享,也即是說的數據不同步,這里就是我們的鎖就可以出來了,他就是來保證線程安全的,在線程獲取並操作數據的時候就會將
屬等棧中存儲的數據會加載到在即本地線程棧當中也就是ThreadLocal,
其中要明白ThreadLocal里面維護的是什么-----一個map 這就是線程安全了呀,
AtomicInteger 這個關鍵字就安全的。
/** * The next hash code to be given out. Updated atomically. Starts at * zero. */ private static AtomicInteger nextHashCode = new AtomicInteger(); /** * The difference between successively generated hash codes - turns * implicit sequential thread-local IDs into near-optimally spread * multiplicative hash values for power-of-two-sized tables. */ private static final int HASH_INCREMENT = 0x61c88647; /** * Returns the next hash code. */ private static int nextHashCode() { //自增 return nextHashCode.getAndAdd(HASH_INCREMENT); }
AtomicInteger 筆記記到這里就設計到鎖相關的知識了:
鎖其實是一件特別好理解的事情,就是一個人操作數據,期間不允許其他人對數據進行操作,這里的人就是指線程,人操作的東西就是數據,而對應數據的操作不過就是讀和寫,所以這里就產生了
讀讀,讀寫,寫寫。寫讀之間的間隔也就是枷鎖,其實線程間的鎖可以類比的數據庫當中也就是mysql中的讀寫鎖啥的,一個道理。其實鎖的本質就是一個阻攔的作用。
下來說spring是如何解決循環依賴的問題
太麻煩了。。。。。。。。