最近公司一个商城系统性能测试,发现数据库商品扣库存这块造成大量阻塞延时,所以想到通过map来改造。
由此引出对Hashmap,Hashtable,ConcurrentHashMap这几个map的一个小测试,看是否线程安全。
// final Map<String,Integer> map = new
// ConcurrentHashMap<String,Integer>();
final Map<String, Integer> map = new HashMap<String, Integer>();
// final Map<String,Integer> map = new Hashtable<String,Integer>();
map.put("a", new Integer(0));
// map.put("b", new Integer("5000"));
final Object lock = new Object();
for (int i = 0; i < 1000; i++) {
Thread th = new Thread(new Runnable() {
@Override
public void run() {
//synchronized (lock) {
System.out.println("Thread:"
+ Thread.currentThread().getName());
map.put("a", new Integer(map.get("a").intValue() + 1));
//}
}
});
th.setName(String.valueOf(i));
th.start();
}
Thread.sleep(5000);
System.out.println(map.get("a"));
结果:不加synchronized的情况下,三种map计算出来的值都不是1000。
对于商品扣库存的场景,我们可以用商品id作为lock,避免使用全局锁,降低锁粒度,优化性能。