- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java多线程知识点梳理和总结面试知识点
一、volatile
1.可见性
(1)当被volatile修饰的变量进行写操作时,这个变量将会被直接 写入共享内存,而非线程的专属存储空间。
①根本原因是在写入后执行了一个空操作,使得cpu的cache写入内 存
(2)当读取一个被volatile修饰的变量时,会直接从共享内存中 读,而非线程专属的存储空间中读。
.有序性
volatile在指令间加上了内存屏障,内存屏障指的是重排序的 时候不能把后面的指令重排序到内存屏障之前的位置。
.原子性(不能保证)(1)原子性指的是一组操作必须一起完成,中途不能被中断。
volatile能确保long、double读写的原子性
①java内存模型保证声明为volatile的long和double变量的get和 set操作是原子的。
.应用场景
(1)多个变量之间或者某个变量的当前值与修改后值之间没有约 束。
①状态标志
②全局变量
③一读多写
c. 一个 segment 包含了一个 hashEntry 链表
2) hashEntry
a.链表结构的元素
b. hashEntry的成员变量除了 value都定义为final
a)为了维护链表结构,防止并发问题
② JDK1.8
Node数组
2)链表
3)红黑树(2)常用方法底层实现(JDK1.7)
put()
1)流程
1.首先Hash定位到Segment
2.对当前Segment加锁,如果Segment中元素的数量超过了阈 值,那么需要进行扩容并且进行rehash
3.再定位到链表头部
get()
1)不用加锁,是非阻塞的
a.因为共享变量都定义为了 volatile
a)根据java内存模型的happen before原那么,对volatile字段的写 入操作先于读操作,即使两个线程同时修改和获取volatile变量,get 操作也能拿到最新的值,这是用volatile替换锁的经典应用场景
b) volatile能够保证内存可见性
2)需要进行两次Hash操作,第一次Hash定位到Segment,第二次 Hash定位到元素所在的链表的头部
3)定位到链表头部之后根据key取出对应的value值
a.如果取出的value是null,那么对取出value这一过程进行加锁 (lock())
a)取出的value是null的原因是可能现在正在进行put操作
b.如果不是value,那么直接返回value值
(3) remove))
1)因为HashEntry中的next是final的,一经赋值以后就不可修 改,所以在定位到待删除元素e的位置以后,程序就将待删除元素前 面的那一些元素全部复制一遍,然后再一个一个重新接到链表上去。 尾结点指向e的下一个结点。e后面的结点不需要复制,它们可以重 用。e之前的元素在remove。之后为remove之前的逆置
④ size()
size()操作涉及到多个segment
size操作就是遍历了两次Segment,每次记录Segment的 modCount值,然后将两次的modCount进行比拟,如果相同,那么表示 期间没有发生过写入操作,就将原先遍历的结果返回,如果不相同, 那么把这个过程再重复做一次,如果再不相同,那么就需要将所有的 Segment都锁住,然后一个一个遍历了(3)特点
①key和value都不可以为null
②get()方法不加锁,是非阻塞的
③是线程平安的
④JDK 1.8使用了 CAS操作来支持更高的并发度,在CAS操作失败 时使用内置锁synchronizedo并且JDK 1.8的实现也在链表过长时会转 换为红黑树。
(4)常用方法底层实现(JDK1.7)
ConcurrentSkipListMap 和 ConcurrentSkipListSet
ConcurrentLinkedQueue
CopyOnWriteArrayList 和 CopyOnWriteArraySet
六、线程分类
.用户线程一般是程序中创立的线程
.守护线程
(1)为用户服务的线程,当所有用户线程停止时才会被终止,如 JVM的垃圾回收(2)通过Thread.setDaemon(true)方法设置守护线程
七、Java内存模型
.主内存
.工作内存
(1)线程开始运行时会将所需的变量从主内存中拷贝一份到工作 内存中,在线程运行结束后再写入主内存
.主内存和工作内存的交互read,writejock,unlock,assgin,use,load,save
.三大特征(1)可见性
①一条线程修改完一个共享变量后,另一个线程假设访问这个变量将 会访问到修改后的值(2)有序性
① Happens-Before 规那么
1)如果一个操作执行的结果需要对另一个操作可见,那么这
您可能关注的文档
最近下载
- YY:T 1870-2023 液相色谱 - 质谱法测定试剂盒通用要求.pdf VIP
- 炎德英才大联考·雅礼中学2026届高三9月月考试卷(二)英语试卷(含答案详解).doc VIP
- 四川省成都市玉林中学2024-2025学年九年级上学期10月月考物理试题.docx VIP
- 石油钻井典型事故案例(钻井课件培训资料).ppt VIP
- 《人民币》解说词全五集.doc VIP
- 工程流体力学(闻建龙)课后习题答案解析.docx VIP
- 吉林省中考英语模拟题及答案.doc VIP
- 四川省巴中市南江县实验中学2024-2025学年九年级上学期10月月考物理试题.docx VIP
- 课件:中石油四起典型事故案例分析.ppt VIP
- 通过法律的社会控制.pdf VIP
文档评论(0)