今天在復習 SpringMVC 時,看到一篇文章,寫到
SpringMvc的控制器是不是單例模式,如果是,有什么問題,怎么解決?
答:是單例模式,所以在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器里面不能寫字段。
對這個回答中的 “不能寫字段”來實現單例類中的線程安全不是很理解,后來通過查閱博客和資料:得出下面這個結論
任何一個類只要沒有成員變量,就是線程安全的。
解釋:
因為成員方法是每個線程私有的,而我們常說的線程安全問題就是我們通過成員方法訪問了成員變量,從而造成了線程之間成員變量狀態不一致的問題,所以只要沒有成員變量,就不會有不一致問題,從而也就不會有線程安全問題。
至於為什么訪問了成員變量就會有線程安全問題: 是因為成員變量的對象分配是在堆內存中的,所以是為所有線程所共享的,所以可能會被多個線程同時訪問,從而造成線程不安全
參考資料:
請問springmvc的controller在單例模式下,如果沒有成員變量為什么就是安全的