在生产的项目中看到类似的代码块,这个锁加的是不是没用呀? 我写了 demo 还试了一下,大佬们看一下?

2020-10-21 17:18:04 +08:00
 kikione

public class TestContronller {

public String method(HttpServletRequest request){
	
    String merchanId=request.getparamter('id');
    
	synchronized (merchanId){

    }
    
    return "  ";
}

}

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

}
Kirsk
2020-10-21 18:48:17 +08:00
就算要用锁 也不是 syc 假装有锁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX