iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java并发和线程安全的知识点有哪些
  • 104
分享到

Java并发和线程安全的知识点有哪些

2023-06-02 23:06:43 104人浏览 安东尼
摘要

这篇“java并发和线程安全的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java并发和线程安全的知识点有哪些

这篇“java并发线程安全的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java并发和线程安全的知识点有哪些”文章吧。

主内存与工作内存交互协议

JMM定义了8种基本操作来完成,主内存、工作内存和执行引擎之间的交互,分别是lock、unlock、read、load、use、assign、store、write,虚拟机的实现向程序员保证每一种操作都是原子的,不可分割,对于double和long类型的64为变量不做保证。了解了这些,有助于帮我们理解内存屏障。

别看有8个操作,实际上是成对定义的连贯操作。我们具体来看怎么记忆。

针对于主内存的单独操作lock和unlock

·lock:作用于主内存、把变量标示为线程独占

·unlock:作用于主内存、释放定状态

主内存到工作内存的读交换

·read:作用于主内存,把主内存变量传递给工作内存

·load:作用于工作内存,把read操作传过来的值放入工作内存

工作内存到主内存的写交换

·store:作用于工作内存,把工作内存变量传递给主内存

·write:作用于主内存,把store过来的值写入主内存变量

工作内存和执行引擎的数据交换

·use:作用于工作内存,把工作内存变量传递给执行引擎

·assign:作用于工作内存,把执行引擎的值赋给工作内存变量

总体来说,工作内存和主内存的数据交换读写都是用两组操作来完成,而执行引擎和工作内存的数据交换由两个操作完成。当然,上述的8种操作必须满足一些规则,这里列举一些我认为重要的,例如:

·read和load、store和write必须同时出现

·对变量执行lock操作,会清空工作内存中缓存的该值,对变量执行unlock操作,必须先把值同步回主内存。

废了这么大的篇幅,讲我们Java程序员并不关心的数据交换细节,是为了帮助我们理解后面的内存屏障,系好安全带,我们继续来看一个完全错乱的Java微观世界。

乱序的Java世界

在单线程的世界里,JMM向我们保证执行的正确性,那么我们可以逻辑的认为代码是根据我们编写的顺序执行。那么在多线程的世界里,站一个线程的视角看另一个线程,我们将完全看不清执行的顺序。并且也看不到对方执行结果。请看下面的代码:

Java并发和线程安全的知识点有哪些

假设有两个线程A、B分别要执行write和read方法,A先进去执行、B随后执行,先抛开a、b线程可见性问题,假设a、b对线程立即可见。最后c值是多少?可能是1,可能是2,甚至可能是0。接下来具体分析一下为什么。

站在B的视角看,它看不清a=1和b=1谁先执行,由于指令重排序,很可能b=1先执行

站在B线程的视角,B线程中read方法里的代码是否会重排序呢,虽然这个方法的两句话存在依赖关系,JMM支持不改变结果的指令重排,JMM无法预先判断是否有其他线程在修改a的值,所以可能会重排,并且处理器会用猜测执行来重排。

指令重排序让线程看不清对方线程的执行顺序,也就是乱序的,那么会有哪些级别的指令重排序呢?有三种:编译器重排序、指令级重排序、内存级重排序。

内存屏障

指令重排序会导致多线程执行的无序,那么JMM会禁止特定类型的指令重排序,JMM通过内存屏障来禁止某些指令重排序,那么有哪些内存屏障呢?总共4类

·LoadLoad:前面的load会先于后面的load装载

·StoreStore:前面的store会先于后面的store执行,也就是保证内存可见性

·LoadStore:前面的load先于后面的store执行

·StoreLoad:前面的store先于后面的Load执行

接下来分别看volatile、final、锁,都有哪些内存语义,加了哪些内存屏障。

volatile

·对volatile变量的写操作,前面插入StoreStore屏障,防止和上面的写发生重排序;后面插入StoreLoad屏障,防止和后面的读写发生重排序。

·对volatile变量的读操作,后面会插入两个屏障,分别是LoadLoad、LoadStore,说白了就是,我是volatile变量,不管你下面的变量是读或者写,我都要先于你读。

final

final本质上定义是final域与构造对象的引用之间的内存屏障。

在构造函数对final变量的写人,与对构造函数对象引用的读,不能重排序,本质上是插入了storeStore屏障,保证对象引用被读之前,已经对final变量进行了写人。这里特别注意指针逃逸。

读含有final变量的对象的引用,与读final变量不能指令重排序,插入loadload屏障,保证先读到对象引用,在读final变量的值,也就是只要对象构造完成,并且在构造函数中将final值写入,另外一个线程肯定可以读到,这是JMM的保证。

ReentrantLock中 有个private volatile int state,本质上是用的volatile的内存语义,这里就省略讲了。

as-if-serial、happens-before

前面说这么多,指令重排序重排序,弄乱了Java程序,JMM提供volatile、final、锁来禁止某些指令重排序,那么记住这些重排序规则并非简单的事,JMM用另外一种好记的理论来帮助程序员记忆。

as-if-serial:用通俗的话来解释一下,单线中,程序逻辑的以我们看到的顺序执行,这里只是可以逻辑的认为顺序执行,其实也会有不影响结果的指令重排,例如:

int i=1;int j=2;int a=i*j;

这里i=1,j=1重排不影响结果,那么实际上JMM是允许的。 有了as-if-serial,在单线程中,程序员不用担心指令重排和内存可见性问题。

happens-before:happens-before保证如果A、B两个操作存在happens before关系,那么A操作的结果一定对B可见,有了可见性的保证,在加上正确的同步,就能写出线程安全的代码。jsR133定义了哪些天然的happens-before关系呢?请看下面:

·一个线程内,每个操作happens-before后面的操作

·unlock操作happens-before对这个这个锁的lock操作

·volatile写操作happens-before读操作

·线程的start方法happens-before此线程的所有其他操作

·线程所有操作happens-before对此线程的终止监测,例如,A线程调用B线程的join方法,如果join返回,那么B线程的所有操作必定完成,且B线程的所有操作的数据必定对A线程可见。

·传递性,A happens-before B、B happens-before C,那么A happens-before C

以上就是关于“Java并发和线程安全的知识点有哪些”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java并发和线程安全的知识点有哪些

本文链接: https://www.lsjlt.com/news/231637.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java并发和线程安全的知识点有哪些
    这篇“Java并发和线程安全的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java并发和线程安全的知识点有哪些...
    99+
    2023-06-02
  • Java并发知识点有哪些
    本篇内容主要讲解“Java并发知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发知识点有哪些”吧!1.并行跟并发有什么区别?从操作系统的角度来看,线程是CPU分配的最小单位。...
    99+
    2023-06-29
  • Java线程学习之并发编程知识点有哪些
    本文小编为大家详细介绍“Java线程学习之并发编程知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程学习之并发编程知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、JMM 基础-...
    99+
    2023-07-02
  • Java线程池知识点有哪些
    这篇文章将为大家详细讲解有关Java线程池知识点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、线程数使用开发规约阿里巴巴开发手册中关于线程和线程池的使用有如下三条强制规约【强制】创建线程或线程池...
    99+
    2023-06-29
  • Java中线程的知识点有哪些
    本篇内容介绍了“Java中线程的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1  .资源冲突,如果两个线程确实是在修...
    99+
    2023-06-17
  • Java高并发的相关知识点有哪些
    本文小编为大家详细介绍“Java高并发的相关知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java高并发的相关知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。读到这里,这篇“Java高并发...
    99+
    2023-06-17
  • Java多线程基础知识点有哪些
    这篇文章主要为大家展示了“Java多线程基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程基础知识点有哪些”这篇文章吧。一、线程什么是线程:线程是进程的一个实体,是CP...
    99+
    2023-06-25
  • Java线程面试题的知识点有哪些
    本篇内容主要讲解“Java线程面试题的知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程面试题的知识点有哪些”吧!一、sychronied 修饰普通方法和静态方法的区别?什么...
    99+
    2023-07-02
  • Java并发编程的基础知识有哪些
    今天小编给大家分享一下Java并发编程的基础知识有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 01、简介首...
    99+
    2023-06-16
  • C#多线程的知识点有哪些
    这篇文章主要介绍“C#多线程的知识点有哪些”,在日常操作中,相信很多人在C#多线程的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程的知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Web安全测试知识点有哪些
    这篇文章主要介绍“Web安全测试知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Web安全测试知识点有哪些”文章能帮助大家解决问题。什么是安全测试?安全测试就是要提供证据表明,在面对敌意和...
    99+
    2023-06-05
  • Web安全学习知识点有哪些
    这篇文章主要讲解了“Web安全学习知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Web安全学习知识点有哪些”吧!一名合格的Web安全工程师是要具备很多的知识点,不但要对网站架构熟...
    99+
    2023-06-27
  • MySQL的并发控制MVCC知识点有哪些
    本篇内容介绍了“MySQL的并发控制MVCC知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MVCCMVCC(Multi-Vers...
    99+
    2023-06-21
  • Java流和文件的知识点有哪些
    这篇文章主要讲解了“Java流和文件的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java流和文件的知识点有哪些”吧! 1.Stream流 ...
    99+
    2024-04-02
  • java web的HTML和CSS知识点有哪些
    这篇文章主要介绍“java web的HTML和CSS知识点有哪些”,在日常操作中,相信很多人在java web的HTML和CSS知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • java URL知识点有哪些
    本篇内容主要讲解“java URL知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java URL知识点有哪些”吧!01、什么是 URL为了搞清楚什么是 URL,需要引入另外两个概念 ...
    99+
    2023-06-19
  • Java NIO的知识点有哪些
    今天小编给大家分享一下Java NIO的知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。No-Block 和Blo...
    99+
    2023-06-17
  • Java栈的知识点有哪些
    这篇文章主要介绍了Java栈的知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java栈的知识点有哪些文章都会有所收获,下面我们一起来看看吧。1.栈的概念栈(stack)又名堆栈,作为一种数据结构,是...
    99+
    2023-06-29
  • java的Classpath知识点有哪些
    本篇内容主要讲解“java的Classpath知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java的Classpath知识点有哪些”吧!java的优点就是他是一个自动支持网络功能的...
    99+
    2023-06-03
  • Java的Queue知识点有哪些
    本篇内容主要讲解“Java的Queue知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的Queue知识点有哪些”吧!Java提供了Quere,相当好用,在1.5版本中又有增强。...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作