最近公司一个商城系统性能测试,发现数据库商品扣库存这块造成大量阻塞延时,所以想到通过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,避免使用全局锁,降低锁粒度,优化性能。
相关推荐
HashMap,HashTable,ConcurrentHashMap 之关联 HashMap、HashTable、ConcurrentHashMap 是 Java 集合类中的重点,以下是对它们的详细解释: HashMap HashMap 是非线程安全的,它的键和值都允许有 null 值存在。...
### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...
- **HashMap**: 相对于`HashTable`,`HashMap`在单线程或低并发情况下具有更好的性能。这是因为`HashMap`没有同步开销,因此操作速度更快。 #### 四、内部实现细节 - **HashTable**: 内部使用了`Entry`类来表示...
此外,从Java 5开始,推荐使用`ConcurrentHashMap`,它通过细粒度锁来提高并发性能,比传统的`Hashtable`更高效。 #### 3. 支持null值 - **Hashtable**: 不支持键或值为null。如果尝试将null作为键或值放入`...
- HashMap 未实现同步,这意味着在并发环境中使用需要手动使用 `Collections.synchronizedMap()` 来同步,或者使用 Java 5 引入的 ConcurrentHashMap,它提供了更好的并发性能和扩展性。 - Hashtable 的同步是内置...
为了防止“fail-fast”迭代器引发的ConcurrentModificationException,建议在多线程场景下使用ConcurrentHashMap,它提供了高级的并发控制策略,以保证在并发环境下的性能和安全性。 总的来说,HashMap、HashTable...
Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...
在 Java 5 及以后版本中,推荐使用 `ConcurrentHashMap` 替代 `Hashtable`,因为它提供了更好的并发性能。 4. **迭代器行为** - `HashMap` 的迭代器是 fail-fast 的,即在迭代过程中,如果其他线程修改了 `HashMap...
- `HashMap`在迭代时的性能通常优于`HashTable`,因为`HashTable`的同步机制降低了并发性能。`HashMap`通过使用迭代器(Iterator)的方式,可以在遍历时避免同步带来的开销。 4. **方法命名**: - `HashTable`...
传统的线程安全解决方案,如Hashtable或使用Collections.synchronizedMap包装HashMap,虽然实现了线程安全,但性能上并不理想,因为它们采用了独占锁,只允许单个线程执行操作。 在JDK 1.6版本中,...
比如使用 `Collections.synchronizedMap()` 工具方法,因此 `Hashtable` 在现代 Java 开发中逐渐被弃用,推荐使用 `ConcurrentHashMap` 来代替,它提供了更高效的并发控制。 综上所述,`HashMap` 通常更适合于单...
3. 使用HashTable:虽然HashTable是线程安全的,但由于其所有操作都是同步的,所以在多线程并发访问时,性能较低。因此,在现代Java开发中,通常更倾向于使用ConcurrentHashMap。 4. 避免在多线程环境中直接使用...
在Java编程语言中,`HashMap`和`Hashtable`都是实现`Map`接口的容器,用于存储键值对数据。它们的主要区别在于线程安全性、继承结构、提供的接口、对`null`值的支持、容量初始化与扩容策略以及哈希计算与冲突解决...
现代开发中更倾向于使用`ConcurrentHashMap`等更高效的并发数据结构。 在实际应用中,应根据具体需求选择合适的`Map`实现类。例如,在需要快速查找并且不关心元素顺序时,可以选择`HashMap`;如果需要排序,则可以...
答:在多线程环境下,可以使用ConcurrentHashMap,它是线程安全的HashMap实现。 五、HashMap与HashSet的关系 HashSet基于HashMap实现,每个元素作为HashMap的一个键,值为null。因此,HashSet的操作性能也依赖于...
- `HashMap` 不是线程安全的,如果需要在多线程环境中使用,需要手动进行同步控制,如使用synchronized关键字或者并发包下的ConcurrentHashMap。 3. **值的约束**: - `Hashtable` 不允许null作为键(key)或值...
由于同步机制的存在,Hashtable的性能相比HashMap较低,现在在多线程需求下,通常更推荐使用ConcurrentHashMap,它在并发性能上做了优化。此外,Hashtable不支持null键和null值。 TreeMap是一种基于红黑树的Map实现...
然而,在Java 1.5之后,ConcurrentHashMap成为多线程环境下推荐使用的线程安全的HashMap替代品,它提供了更好的并发性能。 在实际开发中,理解HashMap和HashTable的底层工作原理以及它们的优缺点至关重要。选择合适...
本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的源码分析。 Atomic 包的介绍 ----------------...
leetcode下载 目录 操作系统 虚拟内存与物理内存转化 CPU 调度方式 进程栈大小 进程与线程区别 线程状态 网络 ...HashTable ConcurrentHashMap JAVA IO Go Redis Redis Cluster Redis 持久化方式 Redis