V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kikione
V2EX  ›  Java

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

  •  
  •   kikione · 2020-10-21 17:18:04 +08:00 · 1897 次点击
    这是一个创建于 1291 天前的主题,其中的信息可能已经有所发展或是发生改变。

    public class TestContronller {

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

    }

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

    }
    Kirsk
        7
    Kirsk  
       2020-10-21 18:48:17 +08:00 via Android
    就算要用锁 也不是 syc 假装有锁
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   778 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:23 · PVG 06:23 · LAX 15:23 · JFK 18:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.