当前位置: 首页 > news >正文

全网第一篇教你怎么总结多线程知识

于「全景图」,我之前也有一直在构建,可是因为知识储备不够,确实很难构建出来。稍微了解过并发领域知识的人都知道,里面的知识点、概念多而散:线程安全、锁、同步、异步、阻塞、非阻塞、死锁、队列(为什么并发要跟队列扯上关系)、闭锁、信号量、活锁等等。如果单个去学这些知识点,单个去练习,如果没有 「主线」,后期很容易忘。我思考再思考,也总结了一下学习并发的主线:

首先,得理解并发的重要性,为什么需要并发?对于这个问题,只需要放在潜意识里面,只需要两个字:性能!其它的细节,再去慢慢拓展。然后,既然并发很重要,而并发处理的是任务,接下就是:对任务的抽象、拆解、分工执行。而线程模型,只是其中的一种模型,还有多进程、协程。Java使用的是多线程模型:对应到具体的代码就是:Thread, Runnable, Task,执行任务有:Exectors。 引出了线程,有势必存在着线程安全性的问题,因为多线程访问,数据存在着不一致的问题。再然后,大的任务被拆解多个小的子任务,小的子任务被各自执行,不难想象,子任务之间肯定存在着依赖关系,所以需要协调,那如何协调呢? 也不难想到,锁是非常直接的方
式(Monitor原理),但是只用锁,协调的费力度太高,在并发的世界里面,又有了一些其它的更抽象的工具:闭锁、屏障、队列以及其它的一些并发容器等;好了,协调的工作不难处理了。可是协调也会有出错的时候,这就有了死锁、活锁等问题,大师围绕着这个问题继续优化协调工具,尽量让使用者不容易出现这些活跃性问题;到此,「并发」的历史还在演化:如果一遇到并发问题,就直接上锁,倒也没有什么大问题,可是追求性能是人类的天性。计算机大师就在思考,能不不加锁也能实现并发,还不容易出错,于是就有了:CAS、copy-on-write等技术思想,这就是实现了 「无锁」并发;可是,事情到此还没有完。如果以上这些个东西,都需要每个程序员自己去弄,然后自己保证正确性,那程序员真累死了,哪还有时间、精力创造这么多美好的应用!于是,计算
机大师又开始思考,能不能抽象出统一模型,可能这就是类似于java内存模型 这样的东西。

总结:(分工、同步、互斥)同步和互斥基本都是用的是管程模型

  1. 为什么要并发或者多线程,目的是为了挤占cpu,让cpu不能闲着
  2. 并发就是多任务处理,对于任务的抽象、拆解对于java而言就是多线程模型,因为一个任务就是一个线程嘛,对应要具体代码就是Runnable、Thread、Task之类的。执行任务的是Executors
  3. java是平台无关的,所以对应的搞了一套java内存模型,即每个线程都有自己的工作内存。当然,这里屏蔽了很多细节,包括cpu缓存、寄存器等等。
  4. 一个大的任务拆成小的任务(分工),如果各个小任务之间没有依赖,那还好,只是简单的分工,提高效率。
  5. 如果说多个任务存在执行依赖,就需要协调(同步)。协调最简单就是不满足条件的时候挂起,满足条件的时候唤醒。
  6. 如果说多个任务存在数据依赖(有共享数据),就会存在线程安全的问题。从计算机底层的视角来看,线程不安全的本质来自于可见性(cpu缓存)、原子性(线程切换)、有序性(各种重排序),那就要解决这些问题,所以java提供很多关键字(sync、final、volatile)来解决,sync表面看起来好像实现的是互斥,其实从计算机底层来看,它也是利用内存屏障来解决可见效、有序性底层问题,用锁来实现原子性
  7. 执行依赖和数据依赖都可以用管程模型解决,阻塞队列+等待队列。
  8. 但是,锁的性能不高,计算大师又想利用无锁的思想来进一步提供性能。

自己总结的并发思维导图:
在这里插入图片描述

http://www.lryc.cn/news/278332.html

相关文章:

  • Mondo备份linux操作系统为iso镜像 —— 筑梦之路
  • 《微信小程序开发从入门到实战》学习七十八
  • React 入门 - 05(响应式与事件绑定)
  • 【APACHE】的认识和基础配置参数
  • 英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述及应用实例(CMU,CCM,TBU,MON)
  • STL之list
  • 【C++】C++11中的常见语法(上)
  • Unity 踩坑记录 AnyState 切换动画执行两次
  • 使用脚本把springboot程序部署到k8s上
  • 使用valgrind 分析缓存命中
  • leetcode-二进制求和
  • 数据采集卡:16通道16位250KHz AD,支持单点采集,程控增益
  • 物联网通讯协议NB-lot和LoRa差异分析
  • 回归预测 | Matlab基于SMA+WOA+SFO-LSSVM多输入单输出回归预测
  • Redis内存策略:「过期Key删除策略」+ 「内存淘汰策略」
  • el-table 个体行绑定点击事件时 表格中有el-radio和el-checkbox 点击触发两次事件处理方法
  • CentOs 环境下使用 Docker 部署 Ruoyi-Vue
  • axios 后端不配和添加api
  • 力扣LCR 166. 珠宝的最高价值(java 动态规划)
  • 【Python基础】一文搞懂:Python 中 Excel 文件的写入与读取
  • 二叉树题目:完全二叉树插入器
  • 用MATLAB求最短路径(graphshortestpath)和求最小生成树(minspantree),代码演示
  • 用win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程
  • MacOS安装Miniforge、Tensorflow、Jupyter Lab等(2024年最新)
  • iOS 应用上架指南:资料填写及提交审核
  • 车速预测 | Matlab基于RBF径向基神经网络的车速预测模型(多步预测,尾巴图)
  • MySQL 5.7.35下载安装使用_忘记密码_远程授权
  • openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题
  • GoLang:gRPC协议的介绍以及详细教程,从Protocol开始
  • LeetCode-2645. 构造有效字符串的最少插入数