问题描述
springboot加锁无效,代码如下:
@GetMapping("/api/tt/{lock}")
public String lockTest4(@PathVariable String lock) {
synchronized (lock) {
return "Hello";
}
}
解决方法
synchronized
在web
开发中通常的多线程里是无效的, 你以为锁住了,实质上这段代码是这样的:
ExecutorService threadPool = Executors.newFixedThreadPool(1000);
threadPool.execute(() -> {
xxxController.lockTest4("lockKey");
});
正确做法
synchronized (lock.intern()) {
...
}
#lock是string
String
的 intern
方法会复用常量池里的对象,所以锁持有的对象是同一个,就不会出现并发操作了。