当前位置: 首页 > Linux

Java并发编程浅析-每个Java开发人员应该了解并发编程的哪些知识?

时间:2023-04-06 20:01:28 Linux

天边,浩瀚之美,喧嚣之美;明心明性,善始善终,唯善善道!——超进《朝槿兮年说》写在开头在这个互联网应用纷繁复杂的时代,如何开发设计出高效稳定的应用来应对复杂的业务需求,一直是我们关注的重点。作为一名JavaDeveloper,相信大家从接触Java开发开始,就对并发编程的概念不陌生。你对Java并发编程最直观的印象是什么?是各大厂面试指导推介的高频热词,还是实际工作中的实际工作场景所必须的高阶开发技术?并发编程的基础和原则是否清晰?接下来,我们一起总结,一起思考。并发编程的三要素所谓并发编程是指在一个处理器上“同时”处理多个任务。并发是同一实体上的多个事件。多个事件在同一时间间隔发生。——百度百科在实际的编程过程中,其实相当多的任务都可以通过顺序编程来解决,但是对于一些特殊的、特定的问题,并发编程会让我们对应用的操作和控制变得非常方便或者甚至是必要的。很大程度上,并发编程“可以说具有确定性,但实际上也具有非确定性”,正是因为如此,并发编程最令人困惑的原因之一:使用并发时需要解决多少问题,以及实现并发的方式有很多种,两者之间没有明显的映射关系。从并发编程帮助我们解决问题的角度来看,主要是应用程序“运行速度”和“设计可管理性”两个方面。由此我们知道,并发编程的三要素主要是指原子性、可见性和顺序。其中:原子性:最小粒度的划分,即不可分割的操作。Java中的原子性意味着一个或多个操作要么全部成功,要么全部失败。有序性:程序执行的顺序是按照代码的先后顺序执行的。cpu可以重新排序指令。可见性:当多个线程访问同一个共享变量时,如果其中一个线程修改了它,其他线程可以立即得到最新修改的值。总结一下,并发本身的本质就是提高运行在单处理器上的程序的性能。实现并发最直接的方法是在操作系统层面使用进程,操作系统会自动隔离资源。但是像Java这样的共享资源,在不同的线程驱动任务之间协调资源的使用,会导致一些资源无法被多个任务访问。因此Java在顺序编程的基础上支持线程的控制,并且只对操作系统透明。“X”程序基本概述在Java中,我们都知道应用程序(ApplicationProgram)的代码会被加载并放入一个类中,最后保存在一个扩展名为.java的文件中,然后通过命令工具和编译环境,生成.class文件,最后宿主到JVM虚拟机上运行,??从而达到我们想要的反馈结果。在这些操作过程中,我们需要了解程序、进程、线程等几个关键概念,其中:![](/img/bVc1nMw)程序(Program):指一组对计算机或其他设备的指令具有信息处理能力以执行动作或作出判断的指令,通常用编程语言编写,运行在目标计算机体系结构上。进程(Process):计算机中的软件程序是系统进行资源分配和调度的基本单位,是操作系统结构的基础,是系统资源分配和调度的基本单位,是对某一数据的运行活动set,也就是说一个进程可以独立运行一个程序。线程(Thead):进程中的实体,是系统独立调度调度的基本单元,是CPU调度调度的最小基本单元。线程本身不拥有操作系统资源,但线程可以与属于同一进程的其他线程通信。共享进程拥有的所有资源。从某种程度上说,进程是程序的实体,线程是进程的实体,进程是线程的容器。三者的区别在于:对于一个程序来说,程序不能单独执行,它是静态的,只有在程序加载到内存中,系统为其分配资源后才能执行。对于一个进程,一个程序动态地执行一个数据集。一个进程包含一个或多个线程。一个线程一次只能由一个进程拥有。进程是分配资源的基本单位。进程拥有独立的内存单元,多个线程共享内存,从而提高应用程序的运行效率。对于线程来说,线程是一个进程中的基本调度单元。线程的划分规模比进程小,并发度高。线程本身不拥有系统资源,但线程可以与属于同一进程的其他线程共享进程拥有的所有资源。.每个独立的线程都有一个程序运行入口、顺序执行顺序和程序出口。综上所述,每个应用程序使用一个内存区域,这个内存区域可以称为一个进程。内存区需要执行代码,具体执行代码由线程执行。需要注意的是,进程只负责开辟内存空间,线程是负责执行代码逻辑的执行单元。除了线程和进程,我们还需要了解什么是监视器、协程和纤程:1.监视器:提供一种机制,让线程暂时放弃互斥访问,等待某些条件满足,重新获得执行权恢复其独占使用权。2.Fiber:是微软组织为了帮助企业程序更好的移植到Windows系统中而加入到操作系统中的一个概念。它由操作系统内核根据相应的调度算法进行控制。它也是一个轻量级的Quantitativethreads。3.协程(Coroutines):一种基于线程的存在,但比线程更轻。这种由程序管理的轻量级线程也叫用户空间线程,对内核不利。可见的。正如一个进程中有多个线程一样,一个线程中也可以有多个协程。协程在运行时也有自己的寄存器、上下文和堆栈。协程的调度完全由用户控制。当协程调度切换时,寄存器上下文和堆栈将保存在分配的私有内存区域中。切换回来时,恢复之前保存的寄存器上下文和栈,直接操作栈,没有内核切换的开销,而且可以访问全局变量,不需要加锁,所以上下文切换非常快。??【特别注意】:1.fiber和coroutine的概念是一样的,都是线程的多对一模型,只是有些地方有所区分,但是从coroutine的本质概念来说:fiber,green线程、微线程这些概念都属于协程的范畴。2.fibers和coroutines的区别在于fibers是在OS层面实现的,而coroutines是在语言层面实现的。纤程由操作系统内核控制,协程对内核不可见。版权声明:本文为博主原创文章,遵循相关版权协议。如需转载或分享,请附上原文出处链接和链接出处。

猜你喜欢