• Java并发编程—并发和并行、线程上下文



    ——————————————————————————

    并发和并行

    • 并发是多线程竞争同一个资源。
    • 并行是指多线程运行,没有资源的竞争。
      注:什么叫做资源?
      ——>变量、方法等都叫资源,占了内存的都叫资源,总之,资源就是变量
    并发和并行的区别
    • 并发有资源竞争,并行没有资源竞争
    • 并发是指多线程对同一个变量进行读写操作【多线程对相同资源进行竞争】
    • 并行是进行不同变量的操作,没有相同变量的竞争

    上下文切换

    • 是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现
    • 以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的
    • 大部分线程,cpu执行完就销毁,cpu就让出来了,有的线程执行完就销毁,有的线程一直执行
    • 不同的操作系统分配的时间片是不同的(linux操作系统分配时间片是等长的20ms,windows操作系统分配时间片是不等长的几ms~几十ms)
    • 有的线程寿命很短,有的线程执行时间特别长,对于寿命特别长的线程,cpu也得切换到下一个线程执行,只是给这个线程不断分配时间片。
    • cpu在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
    • 线程上下文: 线程上下文需要记录上次执行的位置和切换,切换是有消耗的
    • 多线程在切换的时候有性能损耗和时间损耗

    相关问题

    为什么循环次数少的情况下,单线程快?

    因为循环次数少的话,启动其他核去执行任务,本身线程是进入就绪态让cpu去选,选的时候也需要消耗时间;单线程时,数量少的话瞬间就能执行完毕;多线程时,有切换的时间消耗。
    循环次数多的时候,一般是多线程快,不过并不意味着线程多就一定快

    什么时候需要用多线程?

    cpu产生浪费的时候使用多线程,才会让性能得到提升;
    像操作系统同时运行qq,微信等多个线程是为了体验好,开多个线程后性能是会变慢的

    线程上下文切换消耗的时长?

    线程上下文切换消耗的时长——将近1ms一次——达到毫秒级别,消耗很大

    用什么测试的线程上下文?面试回答下面的工具会加分:
    • 使用Lmbench3可以测量上下文切换的时长。
    • 使用vmstat可以测量上下文切换的次数。
    如何减少上下文切换?

    减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。
    协程: 在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

    减少上下文切换实战

    命令:
    sudo -u admin切换管理员权限
    注:dump线程信息:显示这一瞬间的线程信息;dump不知存在于线程中,在其他地方也有,比如数据库等,时记录一瞬间状态的

    如何打印(查看)线程信息?

    jstack命令
    在这里插入图片描述注:命令的意思:
    sudo -u admin:切换到管理员权限
    在 /opt/ifev/java/bin/ :在这个文件夹下面
    执行jstack指令
    传递3117这个参数查询3117这个进程
    保存到/home/tengfei.fangtf/dump17这个文件里面
    grep指令
    grep:筛选,经常用来查询内容
    在这里插入图片描述
    ——>统计,排序,按照一定格式输出
    JBOSS:类似于tomcat,放网站进行运行

  • 相关阅读:
    CollectionUtils常用方法
    ES的测试连通性
    目标检测YOLO实战应用案例100讲-基于改进YOLOv6的轧钢表面细小缺陷检测
    【论文阅读】检索增强发展历程及相关文章总结
    VSCode之C++ & CUDA极简环境配置
    ffmpeg for android编译全过程与遇到的问题
    我国有多少个港口?
    《HelloGitHub》第 91 期
    【PCIE709-F】基于复旦微JFM7VX690T80 FPGA的全国产化8通道光纤双FMC接口数据处理平台
    tomcat
  • 原文地址:https://blog.csdn.net/weixin_53233197/article/details/127438704