一、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掉。
2. https://blog.csdn.net/yanluandai1985/article/details/82590336