掌握系列之并发编程-1.并发基础

掌握高并发、高可用架构

第二课 并发编程

从本课开始学习并发编程的内容。主要介绍并发编程的基础知识、锁、内存模型、线程池、各种并发容器的使用。

第一节 并发基础

并发编程 并发基础 进程 线程 线程通信

系统、包括操作系统的运行是以CPU为核心的,各种数据操作都是在CPU中进行的。所以要学习并发编程,必须要搞清楚和CPU的关系。

CPU简介

经常说CPU是4核8线程的,这个的意思是4个物理核心,每个物理核心虚拟出2个虚拟核心,也就是8个虚拟核心每个虚拟核心在一个时刻只能运行一个线程。

进程和线程

进程的定义:程序被载入内存并开始准备执行,它就是一个进程,也就是说进程是执行中的程序代码。进程是资源分配和程序调度运行的基本单位。

线程的定义:单个进程中执行每个任务就是一个线程。线程是进程中执行运算的最小单位。

一个线程只能属于一个进程,一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务(线程)。

对比 进程 线程
定义 进程是程序实体的运行过程,是系统资源分配和调度运行的基本单位 线程是进程执行任务的最小调度单位
系统开销 创建切换开销大,资源要重新分配和回收 仅保存少量寄存器的内容,开销小,并且在进程的地址空间执行代码
占有资源 拥有分配的所有资源 基本不占资源,仅有其运行不可少的资源(程序计数器、一组寄存器和栈)
安全性 进程间相互独立 线程间共享进程的资源,可以互相通信和影响

CPU线程调度

大多数的应用程序为了提高其执行效率,而采用多线程模式。充分利用CPU的核心来实现高效率运行。那是不是最大只能同时开启8个线程呢?如果想开启更多线程,可以吗?CPU内部该如何处理呢?

对于4核8线程的CPU来说,如果只起8个线程,每个虚拟内核都各自执行一个线程,这是最简单的高效率利用方式。但是在实际使用时这是不可能的。首先,计算机硬件必须有操作才能运行,而操作系统启动后在运行过程中必不可少的要执行各种任务;其次,个人运行的程序也是要启动线程来执行各种各样的任务调度。所以,对于一台电脑,不管是个人PC还是服务器,其真正运行的线程肯定是多于CPU的内核数的,那它是如何保证各个任务流畅运行的呢?

这就是CPU的线程调度。采用一定的算法把CPU的使用权合理的分配给线程,使得任务执行。

有两种调度模型,分时调度抢占式调度

分时调度模型是指让所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU时间片。

抢占式调度模型是指优先让运行池中优先级最高的线程占用CPU,如果优先级相同,则随机选择一个线程来占用CPU。处于运行中状态的线程会一直运行,直到它不得不放弃CPU。

JVM采用抢占式调度。

一个线程会因为以下原因而放弃CPU:

  1. JVM使其暂时放弃CPU,转入就绪状态
  2. 阻塞
  3. 执行结束
串行、并行和并发

串行:是指多个任务,一个执行完接着一个

并行:每个核心执行一个任务,同一时刻多个任务同时执行

并发:多个任务在单核心上执行,同一时刻只有一个任务,系统不停的切换任务,看起来像是同时执行,实际上是不停的切换

多核下的线程数量选择

对于计算密集型任务,线程数量不宜过多,因为本身任务就是高CPU利用率,线程多的话,会因为上下文切换而浪费资源。对于IO密集型任务,比如磁盘IO和网络IO,因为任务是低CPU利用率,所以可以适当多开线程。

原文地址:https://blog.51cto.com/liusw94/2428642

时间: 2024-10-03 16:58:38

掌握系列之并发编程-1.并发基础的相关文章

【Java并发编程】并发编程大合集-值得收藏

http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Ja

【Java并发编程】并发编程大合集

转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Java并发编程]Volatile关键字(上)

Java并发编程:并发容器ConcurrentHashMap

Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低.因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入

Java并发编程:并发容器之ConcurrentHashMap(转)

本文转自:http://www.cnblogs.com/dolphin0520/p/3932905.html Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程

Java并发编程:并发容器之CopyOnWriteArrayList(转)

本文转自:http://www.cnblogs.com/dolphin0520/p/3938914.html Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.从J

【转】Java并发编程:并发容器之ConcurrentHashMap

JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低.因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包.与Vector和Hashtable.Collections.synchronizedXxx()同步容器等相比,util.conc

【并发编程】并发编程中你需要知道的基础概念

本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 多线程是Java编程中一块非常重要的内容,其中涉及到很多概念.这些概念我们平时经常挂在嘴上,但是真的要让你介绍下这些概念,你可能还真的讲不清楚.这篇博客就总结下多线程编程中经常用到的概念,理解这些概念能帮助我们更好地掌握多线程编程. 进程(Process)与线程(Thread) 进程和线程是最常提到的概念了.在linux中,线程与进程最大的区别就是是否共

漫谈并发编程(一) - 并发简介

并发编程是每个程序员进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么容易.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,但是例子得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,由于本人喜欢先论理再论事,而非先论事再论理,所以就以一篇对并发的文字描述开头了. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内只支持运行一个程序,并且这个程序能访问计算机的所有资源.在这个程序完全执行完后,再执行下一个程

漫谈并发编程(一) - 并发简单介绍

并发编程是每一个程序猿进阶的必修之课,想写一个安全稳定,性能强劲的并发程序可没那么easy.我将在未来的日子里,与大家分享一个并发小白成长路上的所思所想.并发编程的思想是通的,可是样例得要是具现的,在该系列中将使用java语言用以演示. 此文作为为漫谈并发编程系列的第一篇,探本溯源,以一篇对并发的文字描写叙述开头. 并发编程由来 早年的计算机中没有操作系统,在某个时间段内仅仅支持运行一个程序,而且这个程序能訪问计算机的全部资源.在这个程序全然运行完后,再运行下一个程序. 在此时,引入并发编程的优