多线程怎么实现对相同的用户(注:用户ID相同)实现同步锁

多线程如何实现对相同的用户(注:用户ID相同)实现同步锁
各位大哥大姐,小弟雪地里跪求!!!!!!!!!


public class Test implements Runnable{

public void run() {
synchronized (this) {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName() + " loop " + i);  
}
}
}

public static void main(String[] args) {

Test demo1= new Test();
Thread t1=new Thread(demo1,"t1");
Thread t2=new Thread(demo1,"t2");
t1.start();
t2.start();

Test demo2= new Test();
Test demo3= new Test();
Thread t3=new Thread(demo2,"t3");
Thread t4=new Thread(demo3,"t4");
t3.start();
t4.start();
}
}
   

------解决方案--------------------
创建对象池,取得对象的标志就是你提到的用户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
}

------解决方案--------------------
你锁的是this,这个是线程对象。
并发的时候,可能会创建很多线程对象,每个线程对象锁自己,因此并没有实现互斥使用同一id的功能。

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

1L方法赞同,不过map应该是static的吧。
另外,每次取用户,判断id放入map的时候,要注意锁map操作(不论是put还是get)。

如果1L的意思是做成单例,那不是static的也没关系了
------解决方案--------------------
楼上的大牛的意思。