HashMap在多线程使用场景下会存在线程安全问题,怎么处理?

简介: HashMap在多线程使用场景下会存在线程安全问题,怎么处理?

HashMap在多线程使用场景下会存在线程安全问题,怎么处理?


HashMap在多线程使用场景下会存在线程安全问题,怎么处理?

解决的方法有三种:

• 使用Collections.synchronizedMap()创建线程安全的map集合

• 使用Hashtable

• 使用ConcurrentHashMap

从效率出发,建议使用ConcurrentHashMap。

Collections.synchronizedMap()如何实现线程安全

private static class SynchronizedMap<K,V> 
    implements Map<K,V>, Serializable { 
      private final Map<K,V> m; // 返回 Map 
  final Object mutex; // 同步对象
  SynchronizedMap(Map<K,V> m) {
   this.m = Objects.requireNonNull(m);
   mutex = this; //设置当前对象互斥量 
}

Collections.synchronizedMap(map)创建出的SynchronizedMap对象,把当前对象作为互斥量(也 可以指定互斥量)。 之后操作该SynchronizedMap,其操作Map的方法都被加上了synchronized。

Hashtable的性能为什么不好?

Hashtable的每个操作都使用了synchronized上了锁,甚至读的操作也上锁。

Hashtable和HashMap有什么区别?

Hashtable的键值不能为null,但HashMap可以为null。

HashMap在存放null的键时做了处理。

为什么要Hashtable设计成不能为null?

因为Hashtable如果可以存null,那么有可能导致判断数据是否已存在时,没办法判断是否是null还 是不存在。

除此之外,Hashtable的初始化容量是11,扩容时是当前容量*2+1。

相关文章
|
6天前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
1天前
|
Java
多线程线程同步
多线程的锁有几种方式
|
3天前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践
|
8天前
|
调度 Python
|
11天前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
49 6
|
11天前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(中)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
51 5
|
11天前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(上)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
43 3
|
1天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
5 0
|
4天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
29 0
|
26天前
|
安全 Java
多线程线程安全问题之避免ThreadLocal的内存泄漏,如何解决
多线程线程安全问题之避免ThreadLocal的内存泄漏,如何解决