一个对象是否是线程安全的,取决于它是否在线程间共享的。如果共享,就是不安全的。所以测试的话,就是在一段时间内,发起多个请求,比较多个请求中,这个对象的属性是否相同。如果相同就是不安全的。
测试类:
public class Test {
public static void main(String[] args) throws Exception {
String prefix = UUID.randomUUID().toString().replaceAll("-", "") + "::";
for (int i = 0; i < 1000; i++) {
final String value = prefix + i;
new Thread() {
@Override
public void run() {
try {
CloseableHttpClient httpClient = HttpClients
.createDefault();
HttpGet httpGet = new HttpGet(
"http://localhost:8080/test?key=" + value);
httpClient.execute(httpGet);
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
====控制器
@Controller
public class TestController {
// 存储已有参数,用于判断参数是否重复,从而判断线程是否安全
public static Set set = new HashSet<>();
@RequestMapping("/test")
public void test(HttpServletRequest request) throws InterruptedException {
// 判断线程安全
String value = request.getParameter("key");
if (set.contains(value)) {
System.out.println(value + "\t重复出现,request并发不安全!");
} else {
System.out.println(value);
set.add(value);
}
// 模拟程序执行了一段时间
Thread.sleep(1000);
}
}