方式一、使用HashTable

Map<String, String> hashtable = new Hashtable<>();

实现原理是在增删改查的方法上使用了synchronized锁机制,在多线程环境下,无论是读数据还是修改数据,在同一时刻只能有一个线程在执行synchronized方法(所有线程竞争同一把锁),因为对整个表进行锁定。所以线程越多,对该map的竞争越激烈,效率越低。


方式二、使用Collections.synchronizedMap

Map<String, String> synchronizedHashMap =

Collections.synchronizedMap(new HashMap<String, String>());

调用synchronizedMap()方法后会返回一个SynchronizedMap类的对象,而在SynchronizedMap类中使用了synchronized同步关键字来保证对Map的操作是安全的。

实现原理是使用工具类里的静态方法,把传入的HashTable包装成同步的,即在增删改查的方法上增加了synchronized锁机制,每次操作hashmap都需要先获取到这个对象锁,这个对象锁加了synchronized修饰,其实现方式和HashTable差不多,效率也很低。


方式三、使用ConcurrentHashMap

Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();

实现原理是HashTable是对整个表进行加锁,而ConcurrentHashMap是把表进行分段,初始情况下分成16段,每一段都有一把锁。当多个线程访问不同的段时,因为获取到的锁是不同的,所以可以并行访问。效率比HashTable

ConcurrentHashMap的实现——JDK7版本

Map实现线程安全的3种方式相关推荐

  1. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

  2. Java面试题:线程实现的两种方式及匿名内部类实现

    QUESTION:线程实现的两种方式及匿名内部类实现 ANSWER: 1.多线程两种实现方式 (1)继承Thread     * 定义类继承Thread     * 重写run方法     * 把新线 ...

  3. pyqt stop停止线程_面试阿里,字节跳动,腾讯90%都会被问到如何终止线程?有几种方式?你都知道吗?...

    在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程终止: 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,因为 ...

  4. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...

  5. 一心多用多线程-线程创建的三种方式

    第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...

  6. 创建线程池的七种方式

    在 Java 语言中,并发编程往往都是通过床架线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景.总结来说线程池的创建可以分为两大类: 通过 Executors ...

  7. 线程池的五种状态及创建线程池的几种方式

    上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...

  8. JUC-多线程(5.获得线程的第三种方式)学习笔记

    文章目录 获得线程的第三种方式 : Callable接口 1. 前言 1. 获得多线程的方法几种? 2. 以下两种获得线程的方式的异同 2. 使用 1. 重写 call 方法 2.创建线程 3.获取返 ...

  9. 创建线程的第三种方式---JDK8新特性

    创建线程的第三种方式-JDK8新特性 实现Callable接口,创建线程 Runnable和Callable接口的不同 1.Callable可以返回一个类型V,而Runnable不可以,也就是说Cal ...

最新文章

  1. IE6、IE7、IE8的CSS、JS兼容
  2. Java Web学习计划
  3. 哈希表查找速度为什么那么快?快在哪里了?
  4. dropbox解决办法
  5. CERC2017 Gambling Guide,最短路变形,期望dp
  6. WebStorm取消默认style样式折叠
  7. Spring源码解析——如何阅读源码
  8. [转]CMMI 入门 - 基本术语:约束、假设、依赖、风险、承诺
  9. Android基于讯飞语音SDK实现语音识别
  10. Cross-validation 交叉验证
  11. 前端开发 - JQuery - 下
  12. 计算机网络原理(谢希仁第八版)第五章课后习题答案
  13. 哲学家就餐问题与python解决方案
  14. python怎么计算复利_用python计算复利和年化收益率
  15. asp.net WebResource.axd请求报404错误
  16. EF Core 日志跟踪sql语句
  17. 正则表达式匹配中文及符号、英文及符号数字空格换行符及常用正则表达式
  18. “最新”手机号码归属地库制作
  19. C语言编辑bmi计算器,使用事件处理程序的BMI计算器计算
  20. vue页面白屏的原因及优化

热门文章

  1. JAVA基础与JAVA基础语法
  2. 在MAC M1(ARM 64)中利用VScode和platform插件配置WCH CH32项目迁移和开发(windows 类似)
  3. 70%以上业务由H5开发,手机QQ Hybrid 的架构如何优化演进?
  4. 【C#】Hashtable哈希表及其与Dictionary字典的区别
  5. 计算机巧用剪纸做画册教案,手工制作教案:剪纸教学案例
  6. 【孙伟】APP项目UI设计基础-工具图标设计视频教程-孙伟-专题视频课程
  7. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务...
  8. Android的Activity屏幕切换动画左右滑动切换
  9. 4个良心亲民的微信小程序,要是早点知道就好了!
  10. Redis 主从配置教程 linux