多线程如何实现对相同的用户(注:用户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)。
------解决方案--------------------
如果1L的意思是做成单例,那不是static的也没关系了
------解决方案--------------------楼上的大牛的意思。