今日小結(2019-8-13)

一、Springboot註解的使用

1. @JsonProperty

@JsonProperty 此註解用於屬性上,作用是把該屬性的名稱序列化爲另外一個名稱,如把trueName屬性序列化爲name,@JsonProperty("name")。

@JsonProperty不僅僅是在序列化的時候有用,反序列化的時候也有用,比如有些接口返回的是json字符串,命名又不是標準的駝峯形式,在映射成對象的時候,將類的屬性上加上@JsonProperty註解,裏面寫上返回的json串對應的名字。

2. @RequestBody

@RequestBody主要用來接收前端傳遞給後端的json字符串中的數據的,請求方式必須爲POST;@RequestBody與@RequestParam()可以同時使用,一個請求,只有一個RequestBody,可以有多個RequestParam;如果參數前寫了@RequestParam(xxx),那麼前端必須有對應的xxx名字才行(不管其是否有值,當然可以通過設置該註解的required屬性來調節是否必須傳),否則會報錯。

詳情參考網址:https://blog.csdn.net/justry_deng/article/details/80972817

二、double判斷相等精度問題

對於double,float浮點數類型,比如double d1=0.0000001,double d2=0d 當判斷兩個數據d1和d2是否相等的時候,一般不直接使用

if(d1==d2)
    ...

 

計算機在計算浮點數類型時會有誤差,我們可以規定在一定誤差範圍內使他們相等,如下代碼:

public static void main(String[] args) {

        double dis=1e-6;
        double d1=0.0000001d;
        double d2=0d;
        System.out.println(d1==d2); //直接判斷爲flase
        System.out.println(Math.abs(d1-d2)<dis);    //允許一定的誤差範圍,判斷結果爲true
    }

三、反射動態回去類屬性,用以參數校驗

當參數爲對象有很多個屬性時,需要判斷屬性值是否有空值,一個一個獲取屬性再判斷比較麻煩,此時我們可以使用反射機制動態獲取屬性並判斷是否爲空,代碼如下:

boolean flag = true;
Object[] fields = Object.getClass().getDeclaredFields();
for(Object field: fields){
      //通過setAccessible(true)的方式關閉安全檢查就可以達到提升反射速度的目的 
      field.setAccessible(true);
      if(field.get(attribute)==null){
             flag=false;
             break;
   }
}

四、多用戶訪問變量共享問題的解決

問題起因:在做一個項目的時候發現當收到多個用戶請求的時候,一個類變量(不是靜態變量,有初始值)的值被一個線程修改後,另外一個線程訪問時直接報錯,顯示是上一個線程修改後的值,並沒有重新初始化。

問題解決:

1. 使用ThreadLocal創建線程副本變量(問題解決,親測)

2. 在線程調用方法返回前重新初始化(還未嘗試)

五、ThreadLocal內存泄露問題

ThreadLocal的內部是ThreadLocalMap。ThreadLocalMap內部是由一個Entry數組組成。Entry類的構造函數爲 Entry(弱引用的ThreadLocal對象, Object value對象)。因爲Entry的key是一個弱引用的ThreadLocal對象,所以在 垃圾回收 之前,將會清除此Entry對象的key。那麼, ThreadLocalMap 中就會出現 key 爲 null 的 Entry,就沒有辦法訪問這些 key 爲 null 的 Entry 的 value。這些 value 被Entry對象引用,所以value所佔內存不會被釋放。若在指定的線程任務裏面,調用ThreadLocal對象的get()、set()、remove()方法,可以避免出現內存泄露。

內存泄漏例子如下:

1. 線程池中使用ThreadLocal導致的內存泄露

線程池裏面設置了ThreadLocal變量一定要記得及時清理,因爲線程池裏面的核心線程是一直存在的,如果不清理,那麼線程池的核心線程的threadLocals變量一直會持有ThreadLocal變量。

2. Tomcat的Servlet中使用ThreadLocal導致內存泄露。

總結:Java提供的ThreadLocal給我們編程提供了方便,但是如果使用不當也會給我們帶來致命的災難,編碼時候要養成良好的習慣,線程中使用完ThreadLocal變量後,要記得及時remove掉。

參考網址:1. http://ifeve.com/%E4%BD%BF%E7%94%A8threadlocal%E4%B8%8D%E5%BD%93%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%AF%BC%E8%87%B4%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2/

2. https://blog.csdn.net/yanluandai1985/article/details/82590336

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章