public class TestContronller {
public String method(HttpServletRequest request){
String merchanId=request.getparamter('id');
synchronized (merchanId){
}
return " ";
}
}
1
justRua 2020-10-21 17:50:45 +08:00
synchronized 把锁加载对象上,关键是 request.getparamter('id')返回来的 String 对象是不是同一个,如果每次获得的对象是 new 出来的那是没用的,这种写法一言难尽,和 synchronized (Integer.valueOf(1))用的异曲同工的感觉,不是什么好写法,其他模块如果也这么写了可能就会有莫名其妙的锁竞争。
|
2
ma836323493 2020-10-21 17:59:35 +08:00
request.getparamter('id'), 应该是 new String() , 与常量池中的不等吧,锁起来应该有用
|
3
6IbA2bj5ip3tK49j 2020-10-21 18:00:56 +08:00 via iPhone
没用,需要 intern()
|
4
lakehylia 2020-10-21 18:17:10 +08:00
你还不如把 synchronized 加到方法上。。。public synchronized String method(HttpServletRequest request){}
|
5
xiangyuecn 2020-10-21 18:23:08 +08:00
这种逼写法就和 @Transactional 一样,交差拿钱了啥也不管,管你有没有效 (狗头
|
6
wysnylc 2020-10-21 18:38:10 +08:00
不要直接使用 intern()有性能问题会疯狂 GC,用 guava 的创建 Interners.newWeakInterner()一个弱引用的内部常量池
具体代码: Interner<String> pool = Interners.newWeakInterner(); synchronized ( pool.intern("BizCode"+userId)){ //TODO:something } |
7
Kirsk 2020-10-21 18:48:17 +08:00 via Android
就算要用锁 也不是 syc 假装有锁
|