java高并发编程详解 pdf_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器、并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢?

只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。

并发容器的由来

1.什么是同步容器

Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。

如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。

所以,Java先提供了同步容器供用户使用。

同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。

2.同步容器,主要的分类

  • Vector
  • Stack
  • HashTable
  • Collections.synchronized方法生成

同步容器面临的问题

可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchronized。

这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。

例如: HashTable只要有一条线程获取了容器的锁之后,其他所有的线程访问同步函数都会被阻塞,因此同一时刻只能有一条线程访问同步函数。

因此为了解决同步容器的性能问题,所以才有了并发容器。

什么是并发容器

java.util.concurrent包中提供了多种并发类容器。

并发类容器是专门针对多线程并发设计的,使用了锁分段技术,只对操作的位置进行同步操作,但是其他没有操作的位置其他线程仍然可以访问,提高了程序的吞吐量。

采用了CAS算法和部分代码使用synchronized锁保证线程安全。

并发容器有哪些分类

1.ConcurrentHashMap

对应的非并发容器:HashMap

目标:代替Hashtable、synchronizedMap,支持复合操作

原理:JDK6中采用一种更加细粒度的加锁机制Segment“分段锁”,JDK8中采用CAS无锁算法。

2.CopyOnWriteArrayList

对应的非并发容器:ArrayList

目标:代替Vector、synchronizedList

原理:利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用,并通过volatile 保证其可见性,当然写操作的锁是必不可少的了。

3.CopyOnWriteArraySet

对应的非并发容器:HashSet

目标:代替synchronizedSet

原理:基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法,其遍历当前Object数组,如Object数组中已有了当前元素,则直接返回,如果没有则放入Object数组的尾部,并返回。

4.ConcurrentSkipListMap

对应的非并发容器:TreeMap

目标:代替synchronizedSortedMap(TreeMap)

原理:Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。

5.ConcurrentSkipListSet

对应的非并发容器:TreeSet

目标:代替synchronizedSortedSet

原理:内部基于ConcurrentSkipListMap实现

6.ConcurrentLinkedQueue

不会阻塞的队列

对应的非并发容器:Queue

原理:基于链表实现的FIFO队列(LinkedList的并发版本)

7.LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue

对应的非并发容器:BlockingQueue

特点:拓展了Queue,增加了可阻塞的插入和获取等操作

原理:通过ReentrantLock实现线程安全,通过Condition实现阻塞和唤醒

实现类:

  • LinkedBlockingQueue:基于链表实现的可阻塞的FIFO队列
  • ArrayBlockingQueue:基于数组实现的可阻塞的FIFO队列
  • PriorityBlockingQueue:按优先级排序的队列

ConcurrentHashMap的实现

73923715b018ecedd1a65ca7cf6d4e5e.png

HashMap,Hashtable与ConcurrentHashMap都是实现的哈希表数据结构,在随机读取的时候效率很高。

Hashtable实现同步是利用synchronized关键字进行锁定的,其是针对整张哈希表进行锁定的,即每次锁住整张表让线程独占,在线程安全的背后是巨大的浪费。

ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度进行区别以及如何区锁定。

上图中,左边是Hashtable的实现方式,可以看到锁住整个哈希表;而右边则是ConcurrentHashMap的实现方式,单独锁住每一个桶(segment).ConcurrentHashMap将哈希表分为16个桶(默认值),诸如get(),put(),remove()等常用操作只锁当前需要用到的桶,而size()才锁定整张表。

原来只能一个线程进入,现在却能同时接受16个写线程并发进入(写线程需要锁定,而读线程几乎不受限制)。

所以,才有了并发性的极大提升。

高并发编程,除了并发容器,还会涉及到并发工具类:CountDownLatch等,后续将详细的介绍并发工具类,以及ConcurrentHashMap的底层实现细节,不仅要知其然,还要知其所以然,这样才能更好的掌握好高并发编程。


以上就是Java并发容器的详解,除了从编程的角度应对高并发,更多还需要从架构设计的层面来应对高并发场景,例如:Redis缓存、CDN、异步消息等,详细的内容如下。

更多高并发架构设计专题

一道多线程面试题可以区分平庸和卓越

827d9b6689a32acf0717fd2d14aa9e08.png

高并发编程,企业级编程指南

77eb7c8ef53dcd37e6f128a94bca6033.png

并发架构资料,获取方式

关注+转发后,私信关键词 【资料】即可获取!

重要的话讲两遍,转发、转发后再发私信,才可以拿到哦!

讲真,一位8 年 Java 经验大牛的面试总结,你照猫画虎还怕收不到offer? 个人情况 坐标魔都,15 年本科毕业于普通一本,毕业后就职于一家传统电信公司,17 年后就职于美团点评指导现在 面试情况 相比于 17 年,由于有了美团的背景,今年在简历这关顺利了很多,不得不感叹大厂背景真香。 本着尽量少请假的原因,所以面试的公司比较少,只面了 3 家:阿里、网易、拼多多。 3 家公司都走完了面试流程,最后拿到了阿里拼多多的 offer,自己还是比较满意的。 至于网易挂掉的原因,具体原因不是很清楚,面试发挥的还行,BOSS 面的时候可以看出对我还是比较满意,但最终没有收到 o 阅读详情

相关推荐

限时无偿分享!阿里P9耗时半年整理的亿级流量Java高并发与网络编程实战PDF

本文的所有案例都是以“理论讲解+环境搭建+完整代码及分析+运行截图”这种完善的结构进行讲解。此外,复杂的案例配有项目结构图,难度较高的案例还分析了底层源码。所有案例的讲解都考虑到了读者可能会遇到的各种问题。

m0_73311735的博客 623

java高并发程序设计(原版电子书)

实战java高并发程序设计 分章 高清 带作业, 葛一鸣等人编著

java教程从入门到精通pdf详细答案解析

说在前面 已经到了月中旬了,程序员们即将迎来面试季,今天刚好有一位粉丝找到我,他上周刚面完奇虎360,经过了几轮的面试,最后薪资也谈了,今天主要是问我想这样的大型互联网公司一般多久会正式下offer。 一般是3~5天HR会通知你,如果一直没有通知的话也可以在4天左右给招聘公司打一个电话,一来可以加深用人单位对你的印象,二来就算没有给你下offer,也可以知道自己有哪些地方不足,这样的话方便下次改正。 今天主要是来讲一讲像这些一线互联网企业的一些面试中的坑,希望对即将面试的你们有所帮助。 Java并发编程技术

m0_57983600的博客 1876

Java并发编程-3.pdf

B站楠哥JUC Java并发编程

5W字高质量java并发系列详解教程()-PDF下载

文章目录第一章 java.util.concurrent简介主要的组件ExecutorExecutorServiceScheduledExecutorServiceFutureCountDownLatchCyclicBarrierSemaphoreThreadFactory第二章 java并发中的Synchronized关键词为什么要同步Synchronized关键词Synchronized Instance MethodsSynchronized Static MethodsSynchronized B

程序那些事 1万+

java高并发 pdf_Java高并发编程详解 PDF 下载

推荐序一推荐序二推荐序三推荐序四前言第一部分 多线程基础第1章 快速认识线程1.1 线程的介绍1.2 快速创建并启动一个线程1.3 线程的生命周期详解1.4 线程的start方法剖析:模板设计模式在Thread中的应用1.5 Runnable接口的引入以及策略模式在Thread中的使用1.6 本章总结第2章 深入理解Thread构造函数2.1 线程的命名2.2 线程的父子关系2.3 Thread与...

weixin_42299472的博客 3207

java spring面试题pdf答案(最全版本持续更新)

前言 涵盖各大公司会问到的面试点,同时随着版本的升级,可能也会有一些面试题更新,也会同步保持更新,因为篇幅原因(其实是我懒,哈哈)所以列了一部分答案,所有的答案见下文,总共485页合计20个技术点,文末自取pdf. 1、不同版本的 Spring Framework 有哪些主要功能? 2、什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度...

it小旭博客 1279

学习《疯狂Java讲义第4版》PDF+代码+课件+面试题分析

学习java选择了《疯狂java讲义》最新的第四版,用了两个多月时间看完,一边阅读,一边敲代码。对Java有了不少新的认识。书中实例清晰明了,讲解也是娓娓道来。Java可以编写图形桌面系统,可以编写游戏,可以操作文件系统,可以进行网络传输。案例能够讲解各种Java基础知识。有意思,能够理解一些知识,敲代码,运行代码,感受代码的魅力!继续努力,学习与实践相结合!读书与实践相结合! 《疯狂Java...

weixin_30270561的博客 5692

7-7 有重复元素的全排列 (10 分)(set容器做法思路加详解)

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档还有更多面试复习笔记分享如下本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取计算给定的n个数有多少种排列方式,即求全排列(可能出现重复的元素)输入格式:第一行输入数字的数量n(n>2),第二行给出每一个数字。输出格式:一个数字,不同排列方式的数量。输入样例:3。

2401_84558091的博客 1192

速度收藏!史上最全Spring 面试题 92 问!【答案】高清PDF下载

吐血整理了Spring面试题一共92题,并且全部归档整理成了一个PDF版本,获取方式在底部! String面试题(92题) 1、不同版本的 Spring Framework 有哪些主要功能? Version Feature Spring 2.5 发布于 2007 年。这是第一个支持注解的版本。 Spring 3.0 发布于 2009 年。它完全利用了 Java5 中的改进,并为...

duchaochen的博客 633

Java并发编程高并发解决方案-学习笔记.pdf

并发编程学习笔记,来源于 itmuch整理,是学习并发的不错的学习资料,有大神的个人感悟。介绍了一些概念,比如并发,高并发,并行,锁。

kubernetes权威指南第四版pdf_阿里P8大佬精心整理:Dubbo+Docker+Kubernetes实战PDf面试题...

前言今天给大家分享微服务架构师指南中的Dubbo+Docker+Kubernetes实战,希望大家能够喜欢!Dubbo用户指南●入门青景需求架构用法●快速启动●服务提供者, 服务消费者.依赖必需依赖缺省依赖可选依赖■成熟度功能成熟度策略成熟度●配置Xml配置, 属性配置注解配置.AP配置●示例启动时检查,集群容错负载均衡线程模型。直连提供者只订阅静态服务多协议多注册中心服务分组, 多版本分组聚合参...

weixin_39627661的博客 2083

Java 高频 200+面试题(整理pdf版),助力拿下offer

并不是哈佛有多么厉害,当然教学质量也是其中原因之一,但更多的是在美国上大学还是挺贵的,首先你能上的起哈佛,说明你的家庭条还不错,从小应该就有很多参加更好教育的机会;这份面试清单是我自2015年担任TeamLeader以来逐步整理的,初衷是为公司招聘提供参考,同时也希望通过它发现自己在Java技术栈中的知识盲区,进而弥补完善,以此提升自己的技术水平。第二,说明你有上进心,也愿意学习;第三,有了这份面试题做理论支撑之后,即使你的实践经验没有那么多,但懂得原理的你,做出来的程序也一定不会太差。

mxt51220的博客 977

阿里P8架构师精心整理:Dubbo+Docker+Kubernetes实战PDf面试题

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候,什么也不知道,是一张真正的白纸,我们靠学习的本能,学会了走路、说话、穿衣服…后来,我们上学了,老师把书本上的知识一点一点灌输到我们的脑子里,我们掌握的知识越来越多,与此同时,我们学习能力却好像越来越差了,习惯了被别人喂饱,似乎忘记了怎么来喂自己了。学习本来只是一种本能,算不上什么能力,然而,经过二十多年的不断学习,学习反而成

知识分享官 963

spring框架高级编程 pdf_半个月整理65道spring面试题,答案全在这里了

这段时间里,我为大家准备了一大批Java相关面试题,学习资料,在这里先分享给大家我整理的65道spring面试题1. 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2. 使用Spring...

weixin_39607710的博客 265

下载破10W+!2025Java面试终极八股文PDF,涵盖90%大厂真题

每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻炼几年,相信对自己能力的提升还是非常大的。从业十多年,我从面试者变成面试官,在 Java 面试上积累了比较丰富的经验。其实,很多面试者在搜集面试资料的时候都踩过一些为了规避这些“坑”,我跑了多家互联网公司,来确认 Java 面试中实际考察的

z1ztai的博客 2319

北上广深,2024,多少K的Java程序员应该懂高并发多线程JVM优化

骨灰级扫地神曾“马士兵”出版的《多线程与高并发》,2020你值得拥有==================================发某粉丝年前参加某个NB企业面试题列表:聊聊synchronized的CPU原语级别实现有一千万个数,写一个程序进行高效求已知2开平方为1.414,如何不用数学库,求开平方的值,精确到小数点儿后面10位编码实现两个线程,线程A不断打印1-10的数字,要求在打印到第五个数字的时候通知线程B自定义线程池需要指定哪7个参数,为什么不建议使用JUC内置线程池?高并发、任务执行时

2401_83412087的博客 850

最全7-1 装载问题 (10 分)(思路+详解)java工程师面试突击第一季

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!开源分享:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】程序员代码面试指南 IT名企算法与数据结构题目最优解这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。

2401_84690353的博客 1054
上一篇: git 使用_Git使用方法
下一篇: python快递费用计算_Python实现快递查询
weixin_39664456
博客等级 码龄9年 23粉丝 130原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值