一、java并发编程的挑战

并发编程需要注意的问题:

并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行。若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战:

线程的上下文切换问题、死锁问题、受限于硬件和软件的资源问题。

1、线程上下文切换

线程上下文切换简述:CPU通过时间片分配算法来循环执行任务,每个线程任务在正常情况下是被CPU轮询执行,当前任务执行完一个时间片后会切换到下一个线程任务。在切换前会保存上一个任务的执行状态,以便下次再切回这个任务时,知道任务执行到哪一步。任务从保存到再次加载的过程就是一次上下文切换。

及时在单核处理器也支持多线程执行,CPU给每个线程分配时间片来实现并发机制。时间片是CPU分配个线程的执行时间,CPU的时间片非常短(几十毫秒),所以CPU需要不停的切换线程,给我们的感觉就是多个线程在同时执行。

每次上下文切换都是需要消耗资源的,从而影响多线程执行的效率。类似于一个人同时在干多件事,每件事都干一点就又去做别的事,并且切换的时候都要记录一下,当前手头工作的节点。那么他同时进行的事越多,上下文切换的成本就越高,同时总体的效率就越低。

减少上下文切换的核心思想:尽可能减少线程数量、尽可能减少锁的使用;

无锁并发编程:线程竞争锁时会引发上下文切换,尽可能避免共享资源被多线程竞争的场景。可采用任务hash分段取模,不同线程处理各自的任务数据。

CAS算法:java的Atomic包中,底层代码使用的比较并替换(CAS)算法解决共享资源的竞争,避免使用锁。

最少线程数:避免创建过多的线程,导致大量线程处于闲置状态。造成任务少、线程多的场景,这样大量线程处于等待状态。

协程:尽可能将多个任务段放到一个线程里实现,在单线程里维持多个任务间的切换。

前俩种方式是避免使用锁,后俩种方式是尽可能减少线程数。

2、死锁

死锁的简述:就是俩个线程相互持有对方需要的资源,并且又同时等待对方释放资源,导致俩个线程相互僵持,谁也不肯让谁。

通常我们不会写出这样傻逼的代码,但是在实际业务中可能会出现,锁在释放时抛异常了导致锁没有正常释放,或者因为异常情况锁没有被成功释放锁等。

避免死锁的方法:

避免一个线程同时获取多个锁;

避免一个线程在锁内同时持有多个资源,通常一个锁之锁住一个资源。

尝试使用定时锁,超过有效时间后自动释放锁。

3、资源限制的挑战

简述:在并发编程中,受到硬件或软件资源的限制,从而导致程序的执行速度受到影响。

这个硬件和软件资源的限制是硬伤,既然没有高射炮,就不要打飞机,并发编程的前提是硬件和软件必须具备一定的标准。解决办法就就是提升硬件并且升级软件。

java并发编程--第一章并发编程的挑战的更多相关文章

  1. [Real World Haskell翻译]第24章 并发和多核编程 第一部分并发编程

    第24章 并发和多核编程 第一部分并发编程 当我们写这本书的时候,CPU架构正在以比过去几十年间更快的速度变化. 并发和并行的定义 并发程序需要同时执行多个不相关任务.考虑游戏服务器的例子:它通常是由 ...

  2. Windows核心编程第一章.错误处理

    Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...

  3. 第一章 C++编程基础

    第一章 C++编程基础 1.1 如何撰写C++程序 赋值 assignment复合赋值 (compound assignment) += 函数(function)是一块独立的程序代码序列(code s ...

  4. 《C#并发编程经典实例》学习笔记-第一章并发编程概述

    并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...

  5. Java 面向对象编程——第一章 初识Java

      第一章    初识Java 1.  什么是Java? Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以其强安全性.平台无关性.硬件结构无关性.语言简 ...

  6. UNIX环境高级编程--第一章 UNIX基础知识

    第一章 UNIX基础知识 1.2 UNIX体系结构   从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...

  7. 读高性能JavaScript编程 第一章

    草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...

  8. Go Web 编程 第一章 Web相关概念

    第一章 Go与Web应用 Go学习群:415660935 1.1 Web应用 在计算机的世界里,应用(application)是一个与用户进行交互,并完成用户特定任务的软件程序.而Web应用则是部署在 ...

  9. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

随机推荐

  1. centos 随机启动脚本编写

    先说下问题背景 目前手上开发的产品是springboot微服务的,我们用jenkins来做的部署,部署脚本如下: 1.build脚本 负责从git服务器拉脚本 2.微服务脚本: #!/bin/shap ...

  2. Echarts配置项详解

    1.图表标题 title: { x: 'left', // 水平安放位置,默认为左对齐,可选为: // 'center' ¦ 'left' ¦ 'right' // ¦ {number}(x坐标,单位 ...

  3. 五、HashMap的使用 及其源码解析

    HashMap的底层实现原理?领接表(数组+链表)hash表数组+链表+红黑树 链表:查找慢 插入 删除快红黑树:查找快 插入 删除慢 HashMap是线程安全的吗?不是线程安全的 在什么情况下 ,是 ...

  4. SQL中新建注释、查询注释和说明

    1.查询注释 SELECT A.name AS table_name, B.name AS column_name, C.value AS column_description FROM sys.ta ...

  5. flex布局下img图片变形的解决方法

      图片正常效果   图片变形效果 一.flex-shrink: 0 给 img 设置 flex-shrink: 0; flex-shrink 的默认值为1,如果没有显示定义该属性,将会自动按照默认值 ...

  6. vscode-golang跳转定义无效问题

    问题发现: 本来可以进行"ctrl"+点击或者F12,进行跳转定义的方式,突然失效了 问题分析: 1.辅助工具是否关闭 解决方案,进入首选项,设置,查找go.docsTool,选项 ...

  7. 【Hibernate】 二级缓存及查询缓存

    一.Hibernate的二级缓存 1.1 类缓存区特点 缓存的是对象的散装的数据. 图一 Hibernate的二级缓存的散装数据 1.2 集合缓存区的特点: 缓存的是对象的id.需要依赖类缓冲区的配置 ...

  8. Go语言——值方法 & 指针方法

    1 package main import ( "fmt" "sort" ) type SortableStrings []string type Sortab ...

  9. linux基础6-bash shell编程

    1. type [-ta] name 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.1.判断一个名字当前是否是alias.keyword.functio ...

  10. python3 pyinstaller

    一.安装python.pywin32.pyinstaller库 二.官网:https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html#general ...