一些疑惑

一、synchronized (類名.class)、synchronized (this.getClass())與synchronized (this)的區別???spring

網上一些說法:session

(1)類名.class叫作「類字面量」,因class是關鍵字, 因此類名.class編譯時肯定。getclass()運行時根據實際實例肯定,getClass()是動態並且是final的。(2)對於靜態方法,因爲此時對象還未生成,因此只能採用類鎖;只要採用類鎖,就會攔截全部線程,只能讓一個線程訪問;對於對象鎖(this),若是是同一個實例,就會按順序訪問,可是若是是不一樣實例,就能夠同時訪問;若是對象鎖跟訪問的對象沒有關係,那麼就會都同時訪問。併發

二、關於常量池是存在堆區仍是存在堆區外的方法區???mvc

  https://blog.csdn.net/u014039577/article/details/50377805/,此博客交代常量池在jdk1.7時移至堆中,在jdk1.8時移除了永久代,用元空間以取代之,其評論也有些說明。框架

三、一開始不理解爲什麼ThreadLocal類中的initialValue()方法返回的是null,由於在get()方法中若是取得的ThreadLocalMap爲null就進入setInitialValue()方法,在setInitialValue()方法中調用initialValue()方法返回的value爲null,一開始始終不理解爲啥在沒有ThreadLocalMap的狀況下給它一個null的值,而後看到了HibernateUtil工具類中獲取session方法的時候,因爲ThreadLocal沒有重寫initialValue()方法,ThreadLocalMap的值始終爲null,因此調用其get()方法返回的爲null,在此狀況下就能夠用set()方法將session塞進線程局部變量中。高併發

四、在service實現層中定義全局變量在高併發的狀況下會出現問題,由於在系統採用springmvc框架的狀況下,springmvc核心控制器DispatcherServlet 默認爲每一個controller生成單一實例來處理全部用戶請求,因此在這個單一實例的controller中,它的XXXService也是一個實例處理全部請求,這樣XXXService的成員變量就被全部請求共享。這樣就會出現併發請求時變量內容被篡改的問題。對於針對全局變量被篡改的狀況能夠經過定義局部變量或者定義全局本地線程變量ThreadLocal來解決。但在使用ThreadLocal時不知道會不會影響性能。百度了一下,ThreadLocal仍是能夠採起的。工具

相關文章
相關標籤/搜索