解决方案 »

  1.   

    创建对象池,取得对象的标志就是你提到的用户ID,用用户ID从对象池中取得对象作为同步用的锁对象就可以了,只要保证用户ID一样(参考equals, hashCode)取得得是同一个锁对象(这里用==比较为true)就可以了。
    public class LockerPool {
        Map<String, String> lockers = new HashMap<String, String>(); // Value可以是任意得对象    public String getLocker(String id) {
            if (!lockers.getKeys().contains(id)) {
                lockers.put(id, "Lock" + id);
            }        return lockers.get(id);
        }    // 实现单例
    }同步代码块
    synchronized(LockerPool.getInstance().getLocker(userId)) {
        // your code
    }
      

  2.   

    你锁的是this,这个是线程对象。
    并发的时候,可能会创建很多线程对象,每个线程对象锁自己,因此并没有实现互斥使用同一id的功能。1L方法赞同,不过map应该是static的吧。
    另外,每次取用户,判断id放入map的时候,要注意锁map操作(不论是put还是get)。
      

  3.   

    如果1L的意思是做成单例,那不是static的也没关系了