错误示范
@GetMapping("/api/tt/{lock}")
public String lockTest4(@PathVariable String lock) {
synchronized (lock) {
return "Hello";
}
}
学synchronized关键字的时候,还记得只要是同一把锁就可以锁住,但是上面的代码,lock对象的构造,就算是相同的字符串,也不是同一个对象,所以会导致这个锁对象每次都不是同一个,也就会导致加锁失效
所以这种用法是错误的!
正确示范
synchronized (lock.intern()) {
...
}
String 的 intern 方法会复用常量池里的对象,所以锁持有的对象是同一个,就不会出现并发操作了。