如何保证集合是线程安全的?

典型回答

  • Java 提供了不同层⾯的线程安全支持。

    • 在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取⼀个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。
    • 普遍的选择是利用并发包提供的线程安全容器类:
      • 各种并发容器,比如 ConcurrentHashMap、CopyOnWriteArrayList。
      • 各种线程安全队列(Queue/Deque),如 ArrayBlockingQueue。
      • 各种有序容器的线程安全版本等。
    • 具体保证线程安全的方式,包括有从简单的 synchronize 方式,到基于更加精细化的,比如基于分离锁实现的 ConcurrentHashMap 等并发实现等。

考点分析

  • 谈到线程安全和并发,可以说是 Java 面试中必考的考点。
  • 如果要深入思考并回答这个问题及其扩展方面,至少需要:
    • 理解基本的线程安全工具。
    • 理解传统集合框架并发编程中 Map 存在的问题,清楚简单同步方式的不足。
    • 梳理并发包内,尤其是 ConcurrentHashMap 采取了哪些方法来提高并发表现。
    • 最好能够掌握 ConcurrentHashMap 自身的演进。

知识扩展

  • 为什么需要 ConcurrentHashMap?

    • Hashtable 本身比较低效,因为它的实现基本就是将 put、get、size 等各种方法加上 “synchronized”。
    • 简单来说,这就导致了所有并发操作都要竞争同⼀把锁,⼀个线程在进行同步操作时,其他线程只能等待,大大降低了并发操作的效率。
    • Hashtable 或者同步包装版本,都只是适合在非高度并发的场景下。
  • ConcurrentHashMap 分析
    • 早期 ConcurrentHashMap,其实现是基于:

      • 分离锁,也就是将内部进行分段(Segment),里面则是 HashEntry 的数组,和 HashMap 类似,哈希相同的条目也是以链表形式存放。
      • HashEntry 内部使用 volatile 的 value 字段来保证可见性,也利用了不可变对象的机制以改进利用 Unsafe 提供的底层能力,比如 volatile access,去直接完成部分操作,以最优化性能,毕竟 Unsafe 中的很多操作都是 JVM intrinsic 优化过的。
      • 核心是利用分段设计,在进行并发操作的时候,只需要锁定相应段,这样就有效避免了类似 Hashtable 整体同步的问题,大大提高了性能。
      • 在构造的时候,Segment 的数量由所谓的 concurrencyLevel 决定,默认是 16,也可以在相应构造函数直接指定。注意,Java 需要它是 2 的幂数值,如果输入是类似 15 这种非幂值,会被自动调整到 16 之类 2 的幂数值。
    • 在 Java 8 和之后的版本中,ConcurrentHashMap 发生了哪些变化呢?
      • 总体结构上,它的内部存储变得和 HashMap 结构非常相似,同样是大的桶(bucket)数组,然后内部也是⼀个个链表结构(bin),同步的粒度要更细致⼀些。
      • 其内部仍然有 Segment 定义,但仅仅是为了保证序列化时的兼容性而已,不再有任何结构上的用处。
      • 因为不再使用 Segment,初始化操作大大简化,修改为 lazy-load 形式,这样可以有效避免初始开销。
      • 数据存储利⽤ volatile 来保证可见性。
      • 使用 CAS 等操作,在特定场景进行无锁并发操作。
      • 使用 Unsafe、LongAdder 之类底层手段,进行极端情况的优化。

《Java 核心技术面试》课程笔记(十)相关推荐

  1. Java核心技术卷一读书笔记

    文章目录 Java核心技术卷一读书笔记 第一章 Java程序设计概述 1.1 关键特性 第二章 Java程序设计环境 2.1 使用命令行工具 第三章 Java的基本查询设计结构 3.1 数据类型 3. ...

  2. java第一节课程笔记、课后习题

    第一课:JAVA初体验 文件名不同的错误 main的单词写错编译的结果 输的的内容没加双引号编译的结果 在一行代码结束没加分号编译的结果 /n 换行 /t 水平线对齐 java程序的注释 /* *He ...

  3. Java核心技术卷一学习笔记1

    在搞本科生毕设之余,闲下来看看书,写写博客.由于研究生学习要做一个数据可视化的项目,需要用到Java.所以拿了一本<Java核心技术卷一>正在一步步复习之前所学的Java知识. 3.9大数 ...

  4. 《Java 核心技术面试》课程笔记(十一)

    Java 提供了哪些 IO 方式? 典型回答 Java IO 基于不同的 IO 抽象模型和交互方式,可以分为: BIO,传统的 java.io 包,它基于流模型实现. 提供了我们最熟知的⼀些 IO 功 ...

  5. 《Java核心技术面试精讲--杨晓峰》学习笔记目录

    这仅仅是我个人的理解,想要仔细了解请去 极客时间 购买阅读 笔记会写的很多,也是一个夯实基础的过程吧 笔记的内容大部分是从专栏以及留言区摘录 10 11 12 中涉及到的 IO 与 NIO 知识点我许 ...

  6. java核心技术面试精讲

    前言 大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是"HUAWEI"面经!这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友 ...

  7. 《Java核心技术》学习笔记——第8章 泛型程序设计

    版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载. 第8章 泛型程序设计 作者:ExcelMann,转载需注明. 第8章内容目录: 为什么要使用泛型程序设计 定义简单泛型类 泛型 ...

  8. 深藏功与名!献给学弟学妹的“Java核心面试知识笔记”

    2021 年一个不平淡的一年,金三银四也快要过去,各路码友们都开始磨拳擦脚,背面试题.知识点.小编最近日熬夜整理了一份关于 SpringBoot,JVM 篇,多线程 &并发,Spring,My ...

  9. 2022最新总结【Java岗面试核心笔记】速成版

    ​ 在备战面试的时候,大家总会通过刷题的方式来准备,然而刷题是有用没错,有时候还得看看押题能不能压中重点,大厂喜欢问些什么技术点,不然当那个笑眯眯的面试官问出那些你再熟悉不过的问题 Java 问题时, ...

最新文章

  1. centos 安装pip3
  2. tl r402路由器设置_tplink wr847n无线路由器如何设置 tplink wr847n无线路由器设置方法【详解】...
  3. nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群
  4. linux终端怎么设置monaco,Monaco Editor 使用指南
  5. Cascade R-CNN升级!目标检测制霸COCO,实例分割超越Mask R-CNN
  6. JavaWeb学习笔记7--JSP脚本元素、指令元素、动作元素
  7. JWT实现加密用户信息及信息验证
  8. TS:声明合并de妙处
  9. 手把手教你SPSS进行ROC曲线分析
  10. 关于yolov3.weights文件下载地址的分享
  11. 人为何有指纹【转自生物谷】
  12. asp mysql 查询_ASP基础教程:数据库查询语言(1)
  13. uname命令的用法
  14. 智慧停车成为了改善停车环境、满足停车需求的“香饽饽”
  15. 第59期、基于Java springboot医院信息管理系统
  16. XQN-vivado fix类型
  17. 上海阿尔卡特朗讯7360远程从网管机传送ONU
  18. 快速建站该怎么实现?
  19. html focus 唤醒手机键盘,移动端 input 元素 focus 的时候调出键盘(自动触发 focus 事件的同时调出键盘)?...
  20. rails pry使用_在Rails中使用Google Maps

热门文章

  1. c语言周欢,安徽遴选20名教师参加第一届长三角民办高校教师教学技能大赛
  2. 对不起,我是计算机专业但我真的不会修电脑
  3. RH236客户端配置--通过CIFS挂载
  4. Pre-training Enhanced Spatial-temporal Graph Neural Network for Multivariate Time Series Forecasting
  5. 13.Elasticsearch 7.15 Query DSL 之 term查询、terms查询和terms set查询
  6. java 成员变量调用其他类方法6_方法内部类中不能访问外部类的成员变量。
  7. 吃货联盟订餐系统(对象+数组)
  8. 你懂得咋选择彩光模块吗?其实也没那么难!
  9. 新能源汽车远程监控车载终端TBOX
  10. 数据库管理系统设计- SDUST