爲何單例模式能夠支持多線程併發訪問?
一、spring單例模式是指,在內存的堆中只實例化一個類的對象
二、類的變量有線程安全的問題,就是有get和set方法的類成員屬性。執行單例對象的方法不會有線程安全的問題
由於方法是磁盤上的一段代碼,每一個線程在執行這段代碼的時候,會本身去內存申請臨時變量spring
爲何局部變量不會受多線程影響?
一、對於那些會以多線程運行的單例類,例如Web應用中的Servlet,每一個方法中對局部變量的操做都是在線程本身獨立的內存區域內完成的,因此是線程安全的
二、局部變量不會受多線程影響
三、成員變量會受到多線程影響
四、對於成員變量的操做,可使用ThreadLocal來保證線程安全安全
JVM是如何實現線程的獨立內存空間?
Java中的棧
一、每當啓用一個線程時,JVM就爲他分配一個Java棧,棧是以幀爲單位保存當前線程的運行狀態。某個線程正在執行的方法稱爲當前方法,當前方法使用的棧幀稱爲當前幀,當前方法所屬的類稱爲當前類,當前類的常量池稱爲當前常量池。當線程執行一個方法時,它會跟蹤當前常量池。
二、每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀,這個幀天然就成了當前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。
三、Java棧上的全部數據都是私有的。任何線程都不能訪問另外一個線程的棧數據。因此咱們不用考慮多線程狀況下棧數據訪問同步的狀況。多線程
spring是否使用了threadlocal?
ThreadLocal是JDK提供的爲解決線程安全的一種解決辦法
spring本身確定用到了ThreadLocal
原文:https://blog.csdn.net/hello_ken/article/details/20177341
併發