代码如下,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)) {
// 查询数据
// 没有数据则新增
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.