日期:2014-05-20  浏览次数:20756 次

在java中 如何用Lock实现和synchronized(Object)的效果
private static ConcurrentHashMap<String,String> data = new ConcurrentHashMap<String,String>();
private String value = null;
public String getContent(receivingParameters) {
lock.lock(); try {
//synchronized (data) {
value = data.get(receivingParameters);
if (value == null) {
data.put(receivingParameters,//随机数);
  return data.get(receivingParameters);
   
} else {
  return value;
}
//}
}finally {
lock.unlock();
}
}

如果同时有多个请求同时传递一个receivingParameters,采用Lock会有几次存入不同的随机数,不符合要求。采用synchronized(data)就只会走一次value==null的判断,返回的都是同一个随机数,符合要求。

------解决方案--------------------
探讨

我是测的并发访问数,我有一个servlet,接收到参数后,new一个对象(每个请求都会new一个新的对象),调用这个对象的方法(这个对象的方法就是上述代码。然后把参数传给这个方法)。有的话直接从map里拿,没有的话,把参数作为key,随机数作为value存到map中,然后再返回这个value,用lock没有锁住,
看测试的结果好像是并发的请求同一个参数,拿到了不同的值,不知道我这样理解对不对。……