Java并发(1)--线程,进程,以及缓存

这篇具有很好参考价值的文章主要介绍了Java并发(1)--线程,进程,以及缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程和进程是什么?

进程

进程是程序的一次执行过程,系统程序的基本单位。有自己的main方法,并且主要由主方法运行起来的基本上就是进程。

线程

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

线程的状态

新建,就绪,运行,等待,阻塞,死亡。

当两个线程分别thread.start()时,只是将线程变成了就绪态,不是运行态,所以运行的顺序,还不一定。

线程与进程的关系,区别及优缺点?

图解关系

下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。

图片来自JavaGuide

Java并发(1)--线程,进程,以及缓存,java,缓存,开发语言

从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)*资源,但是每个线程有自己的*程序计数器虚拟机栈本地方法栈

一句话简单了解堆和方法区

堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (几乎所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

总结

线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

高速缓存存在的意义?多级缓存的作用?

高速缓存

结论:支持了多核CPU的发展

相当于在CPU 内部再开辟了一个区域,用于连接CPU中的核心和内存。也就是原先是CPU和内存交互,这样占据总线,其他核心就不能再次与内存进行交互。有了高速缓存之后,核心可以与高速缓存交互,然后高速缓存和内存交互,(相当于把高速缓存变成单核,整体速度提升),这样释放总线,不会有被占用的情况。

如果需要对一个变量累加50次,但是不一定高速缓存全加完才更新返回到内存区,实际是可能是累加两次就返回,之后再进入高速缓存区进行累加,所以更新多少次进行返回是不确定的

如果变量或数据更新完毕,那么传入内存后,高速缓存中的数据就会消失。

在高速缓存中,进程的切换与时间片有关,如果数据处理量很大的话,多线程可能会发生覆盖的问题,例如两个线程都给a累加5000次,那么a的极端情况可能会是2,可能导致线程1和线程2的累加操作互相覆盖,第一个线程刚累加第一次,a变成2,然后进程切换,返回给内存,a又变成1。如果数据量很小的话,时间片够,那就不会进行切换。

多级缓存

相当于50个人接力 打水。站在一起,把水传递给下一个人。让传递速度加快,效率更高。

并发与并行的区别

  • 并发:两个及两个以上的作业在同一 时间段 彼此互相干扰 内执行。

  • 并行:两个及两个以上的作业在同一 时刻 互不干扰的执行。

最关键的点是:是否是 同时 执行,和是否互相干扰。

如果能同时执行,那证明一定是互不干扰的。在同一时间段内,细分时间,一个时间内不能两个作业同时进行,那么证明一定是互相干扰的。

同步和异步的区别

  • 同步:发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。

  • 异步:调用在发出之后,不用等待返回结果,该调用直接返回。

例如:a调用一个资源,但是资源被其他作业占用,那么我需要一直等着就是同步,调用完我继续做我自己的事,不傻等着就是异步。

为什么要使用多线程?

先从总体上来说:

  • 从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。

  • 从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。

再深入到计算机底层来探讨:

  • 单核时代:在单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统的效率。 假设只运行了一个 Java 进程的情况,当我们请求 IO 的时候,如果 Java 进程中只有一个线程,此线程被 IO 阻塞则整个进程被阻塞。CPU 和 IO 设备只有一个在运行,那么可以简单地说系统整体效率只有 50%。当使用多线程的时候,一个线程被 IO 阻塞,其他线程还可以继续使用 CPU。从而提高了 Java 进程利用系统资源的整体效率。

  • 多核时代: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,不论系统有几个 CPU 核心,都只会有一个 CPU 核心被利用到。而创建多个线程,这些线程可以被映射到底层多个 CPU 上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。文章来源地址https://www.toymoban.com/news/detail-853734.html

到了这里,关于Java并发(1)--线程,进程,以及缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(48)
  • 关于进程、线程、协程的概念以及Java中的应用

    本文将从“操作系统”、“Java应用”上两个角度来探究这三者的区别。 在我本人的疑惑中,我有以下3个问题。 在“多道程序环境下”,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性以及不可再现性的特征,因此需要引入进程的概念。 进程是程序执行的过

    2024年02月08日
    浏览(62)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(52)
  • Java并发编程——伪共享和缓存行问题

    在Java并发编程中,伪共享(False Sharing)和缓存行(Cache Line)是与多线程访问共享数据相关的两个重要概念。 伪共享指的是多个线程同时访问同一个缓存行中的不同变量或数据,其中至少一个线程对其中一个变量进行写操作。由于处理器缓存行的一致性协议要求缓存行中的数

    2024年02月02日
    浏览(37)
  • Java多线程与并发

    序号 地址 1 计算机网络核心 2 数据库相关 3 Redis 4 Linux相关 5 JVM的内容 6 GC相关的 7 Java多线程与并发 8 Java多线程与并发-原理 9 Java常用类库与技巧 10 Java框架-Spring 1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因:Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与

    2024年02月10日
    浏览(42)
  • JAVA的多线程及并发

    继承 Thread 类; 实现 Runnable 接口; 实现 Callable 接口通过 FutureTask 包装器来创建 Thread 线程; 使 用 ExecutorService 、 Callable 、 Future 实 现 有 返 回 结 果 的多 线 程 ( 也 就 是 使 用 了 ExecutorService 来管理前面的三种方式)。 1、使用退出标志,使线程正常退出,也就是当 run

    2024年03月13日
    浏览(50)
  • Java并发(四)----线程运行原理

    1.1 栈与栈帧   Java Virtual Machine Stacks (Java 虚拟机栈 JVM) 我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存 每个

    2024年02月02日
    浏览(41)
  • Java 并发(多线程)超详细

    此文章已收录至项目 Developer-Knowledge-Base https://www.cnblogs.com/snow-flower/p/6114765.html java 中的 Lock 锁 https://javaguide.cn/java/concurrent/java-concurrent-questions-03.html https://www.cnblogs.com/lifegoeson/p/13683785.html 程序是由指令和数据有序组成的静态概念,程序本身没有运行的含义,只有在处理器赋予

    2024年02月09日
    浏览(40)
  • 【Java|多线程与高并发】线程池详解

    Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。 为什么从线程池里面取线程比直接创建线程快呢? 创建线程是

    2024年02月11日
    浏览(47)
  • 【Java 并发编程】Java 线程本地变量 ThreadLocal 详解

    先一起看一下 ThreadLocal 类的官方解释: 用大白话翻译过来,大体的意思是: ThreadLoal 提供给了 线程局部变量 。同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且 该副本只能由当前 Thread 使用 。

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包