一、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