代码如下,add 方法中有一个 synchronized 代码块,锁定的是 uid 字符串,代码中的逻辑也很简单,先查询没有则新增,有则不做操作。但是这个方法会出现重复新增的情况,也就是没锁住,多个线程进来了。发生这种情况的数据量也很少,大概几千条数据就一两条出现这种情况.大家有什么看法吗?
补充一下:出现上述并发情况下打印过锁定对象的内存地址值,结果发现地址值也是一样的。
public class StringPoolUtil {
private static final Interner<String> POOL = Interners.newWeakInterner();
public static Interner<String> getPool(){
return POOL;
}
}
public void add(String uid){
synchronized (StringPoolUtil.getPool().intern(uid)) {
// 查询数据
// 没有数据则新增
}
}