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