今日小结(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

 

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