前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发基础之重要概念

并发基础之重要概念

作者头像
suveng
发布于 2019-09-18 06:03:44
发布于 2019-09-18 06:03:44
47800
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_37933685/article/details/80850429

个人博客:https://suveng.github.io/blog/​​​​​​​

并行计算基础

为什么需要并行

  • Linus Torvalds :并行计算只有在 图像处理 和 服务端编程 2个领域可以使用,并且它在这2个领域确实有着大量广泛的使用。但是在其它任何地方,并行计算毫无建树!

并行计算还出于业务模型的需要

  • 并不是为了提高系统性能,而是确实在业务上需要多个执行单元。
  • 比如HTTP服务器,为每一个Socket连接新建一个处理线程
  • 让不同线程承担不同的业务工作
  • 简化任务调度

几个重要的概念

  • 同步(synchronous)和异步(asynchronous)
  • 并发(Concurrency)和并行(Parallelism)
  • 临界区
  • 阻塞(Blocking)和非阻塞(Non-Blocking)
  • 锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)
  • 并行的级别

1.同步(synchronous)和异步(asynchronous)

2.并发(Concurrency)和并行(Parallelism)

3.临界区

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程 使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

4.阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞通常用来形容多线程间的相互影响。

比如一个线程占用了临界区资源,那么其它所有需要 这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。

非阻塞允许多个线程同时进入临界区

5.死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行.

6.并发级别

  1. 阻塞 当一个线程进入临界区后,其他线程必须等待
  2. 非阻塞
    1. 无障碍 无障碍是一种最弱的非阻塞调度,自由出入临界区,无竞争时,有限步内完成操作,有竞争时,回滚数据
    2. 无锁 是无障碍的,保证有一个线程可以胜出
    3. 无等待 无锁的,要求所有的线程都必须在有限步内完成,无饥饿的

有关并行的2个重要定律

Amdahl定律(阿姆达尔定律)

Amdahl定律(阿姆达尔定律) – 定义了串行系统并行化后的加速比的计算公式和理论上限 – 加速比定义:加速比=优化前系统耗时/优化后系统耗时

加速比= 优化前系统耗时/ 优化后系统耗时=500/400=1.25

结论:

增加CPU处理器的数量并不一定能起到有效的作用,提高系统内可并行化的模块比重,合理增加并行处理器数量才能以最小的投入,得到最大的加速比

Gustafson定律(古斯塔夫森)

说明处理器个数,串行比例和加速比之间的关系

结论:

只要有足够的并行化,那么加速比和CPU个数成正比

线程的基本操作

中断线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void Thread.interrupt() // 中断线程
public boolean Thread.isInterrupted() // 判断是否被中断
public static boolean Thread.interrupted() // 判断是否被中断,并清除当前中断状态

挂起(suspend)和继续执行(resume)线程

– suspend()不会释放锁 – 如果加锁发生在resume()之前 ,则死锁发生

等待线程结束(join)和谦让(yeild)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final void join() throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException
static void yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。  

线程执行完毕后,系统会调用notifyAll();

不要在Thread实例上使用 wait()和notify()方法

守护线程

  1. 在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程
  2. 当一个Java应用内,只有守护线程时,Java虚拟机就会自然退出

线程优先级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

Thread high=new HightPriority();
LowPriority low=new LowPriority();
high.setPriority(Thread.MAX_PRIORITY);
low.setPriority(Thread.MIN_PRIORITY);
low.start();
high.start();

基本的线程同步操作

synchronized

– 指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。 – 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。 – 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

Object.wait() Obejct.notify()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA并发修炼手册 | 并发的概念
它是互联网分布式系统架构设计中必须考虑的因素之一,通常是指,保证系统能够同时并行化处理海量请求
battcn
2018/12/13
6510
高并发Java(1):前言
很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。
用户5640963
2019/07/25
7350
高并发Java(1):前言
并发编程系列之线程并行学习笔记
同步和异步的本质区别是是否需要等待,比如一个方法在执行,必须等前面一个方法程执行完成,才可以执行,这就是同步。如果不需要等上一个方法执行完成,并行或者并发执行,这就是异步调用。
SmileNicky
2022/05/07
3020
线程并行学习笔记
同步和异步的本质区别是是否需要等待,比如一个方法在执行,必须等前面一个方法程执行完成,才可以执行,这就是同步。如果不需要等上一个方法执行完成,并行或者并发执行,这就是异步调用。
SmileNicky
2019/01/17
4210
Java并行-0.基本概念
临界区表示被多个线程使用的公共资源,但是每一次只能有一个线程使用它。 比如打印机资源。
悠扬前奏
2019/05/28
5400
并行的2个重要定律Amdahl、Gustafson定律
同步和异步通常用来形容方法的调用方式。 同步的方法调用时,后续行为需要等到方法执行完毕后才能执行。 异步调用时,一旦调用可以立即拿到结果,调用方可以继续后续的操作。
青山师
2023/05/04
5620
并行的2个重要定律Amdahl、Gustafson定律
java高并发系列-第1天:必须知道的几个概念
接下来一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。
路人甲Java
2019/12/10
8620
java高并发系列-第1天:必须知道的几个概念
Java线程安全策略与多线程并发最佳实践
不可变对象(Immutable Objects)是指对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象。
全菜工程师小辉
2019/08/16
1.2K0
Java并发简介(什么是并发)
并发编程中有很多术语概念相近,容易让人混淆。本节内容通过对比分析,力求让读者清晰理解其概念以及差异。
鱼找水需要时间
2023/03/09
8250
Java并发简介(什么是并发)
并发专有名词介绍
虽然这个世界充满了不确定性,但是你可以用自己的超级确定性,来对冲外界的不确定。作为个体,我们貌似无力反抗,但是我们手里扣着一张王牌,就是技术。
程序员小强
2019/09/20
6570
并发专有名词介绍
带你理解 QPS、TPS、RT、并发数、吞吐量...
在了解qps、tps、rt、并发数之前,首先我们应该明确一个系统的吞吐量到底代表什么含义,一般来说,系统吞吐量指的是系统的抗压、负载能力,代表一个系统每秒钟能承受的最大用户访问量。
Java3y
2020/08/28
6.1K0
带你理解 QPS、TPS、RT、并发数、吞吐量...
什么是线程安全,以及并发需要知道的几个概念
众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。为了追求成为一个好的Java程序员,我决定从今天开始死磕Java的并发编程,尽量弥补自己在这方面的知识缺陷。
Debian中国
2020/01/21
3340
高并发Java(2):多线程基础
使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。
用户5640963
2019/07/25
5260
高并发Java(2):多线程基础
【修正版】QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
在了解qps、tps、rt、并发数之前,首先我们应该明确一个系统的吞吐量到底代表什么含义,一般来说,系统吞吐量指的是系统的抗压、负载能力,代表一个系统每秒钟能承受的最大用户访问量。
艾小仙
2021/01/11
2.5K0
《java并发编程实战》总结
①发挥多处理器的强大优势 ②建模的简单性 ③异步事件的简化处理④相应更灵敏的用户界面
CBeann
2023/12/25
2570
《java并发编程实战》总结
Java 面试知识点解析(二)——高并发编程篇
在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧。
我没有三颗心脏
2018/05/10
1K4
Java并发编程实战系列11之性能与可伸缩性Performance and Scalability
线程可以充分发挥系统的处理能力,提高资源利用率。同时现有的线程可以提升系统响应性。 但是在安全性与极限性能上,我们首先需要保证的是安全性。 11.1 对性能的思考 提升性能=用更少的资源做更多的事情(太对了,这才是问题的本质)。 资源包括:CPU时钟周期,内存,网络带宽,I/O带宽,数据请求,磁盘空间等。 资源密集型说的就是对上述维度敏感的应用。 与单线程相比,多线程总会一起一些额外的性能开销: 线程协调with coordinating between threads (locking, signali
JavaEdge
2018/04/28
8490
软考高级架构师:系统性能设计-阿姆达尔定律概念和例题
系统性能设计中的一个重要概念是阿姆达尔定律(Amdahl’s Law)。阿姆达尔定律是由吉恩·阿姆达尔(Gene Amdahl)在1967年提出的,用于评估系统性能提升的理论上限,特别是在考虑并行计算时。该定律表明,系统性能提升的潜力受到系统中可并行化部分的限制。
明明如月学长
2024/05/24
5970
软考高级架构师:系统性能设计-阿姆达尔定律概念和例题
详解并发编程的优缺点
一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发?凡事总有好坏两面,之间的trade-off是什么,也就是说并发编程具有哪些缺点?以及在进行并发编程时应该了解和掌握的概念是什么?这篇文章主要以这三个问题来谈一谈。
本人秃顶程序员
2019/05/05
9110
详解并发编程的优缺点
java高并发系列-第3天:有关并行的两个重要定律
java高并发系列第3篇文章,一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。
路人甲Java
2019/12/10
7980
java高并发系列-第3天:有关并行的两个重要定律
相关推荐
JAVA并发修炼手册 | 并发的概念
更多 >
LV.1
广州趣丸网络科技有限公司JAVA开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验