一种java线程安全不安全的模拟web请求测试方法

并发与高并发(一)

  • 线程安全不安全写法测试
    • 不安全的写法
    • 不安全写法测试
    • 安全写法
    • 安全写法测试
    • 知识点

线程安全不安全写法测试

在工作中代码走查时发现部分代码存在线程安全的隐患,一直想测试以下,在模拟web的http请求中,线程不安全的类放在请求controller中属性位置和方法体内的不同表现

不安全的类:SimpleDateFormat
测试工具: jmeter

不安全的写法

   @RestController
public class TestThreadSafeController {

    //线程不安全的类放在类的属性中,在并发请求中,会出现线程安全的问题
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    @RequestMapping("getDate")
    public void getDate(HttpServletResponse request,HttpServletResponse response){

        try {
            Date date = sdf.parse("20200317");
            System.out.println(date.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

}

不安全写法测试

线程组设置1000请求测试
一种java线程安全不安全的模拟web请求测试方法_第1张图片
一种java线程安全不安全的模拟web请求测试方法_第2张图片
可看到大概有25%的异常率

安全写法


@RestController
public class TestThreadSafeController {


    @RequestMapping("getSafeDate")
    public void getSafeDate(HttpServletResponse request,HttpServletResponse response){
        //线程不安全的类,放在请求方法体中,并发请求不会出现线程不安全的问题
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        try {
            Date date = sdf.parse("20200316");
            System.out.println(date.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

安全写法测试

一种java线程安全不安全的模拟web请求测试方法_第3张图片
一种java线程安全不安全的模拟web请求测试方法_第4张图片

知识点

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

一种java线程安全不安全的模拟web请求测试方法_第5张图片

你可能感兴趣的:(并发与高并发,java)