SpringBoot 中正确使用锁

4,718 阅读1分钟

错误示范

@GetMapping("/api/tt/{lock}")
public String lockTest4(@PathVariable String lock) {
    synchronized (lock) {
      return "Hello";
    }
}

synchronized关键字的时候,还记得只要是同一把锁就可以锁住,但是上面的代码,lock对象的构造,就算是相同的字符串,也不是同一个对象,所以会导致这个锁对象每次都不是同一个,也就会导致加锁失效 所以这种用法是错误的!

正确示范

synchronized (lock.intern()) {
    ...
}

Stringintern 方法会复用常量池里的对象,所以锁持有的对象是同一个,就不会出现并发操作了。