一。首先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是如何解決循環依賴的問題
太麻煩了。。。。。。。。