java并发编程--第一章并发编程的挑战
一、java并发编程的挑战
并发编程需要注意的问题:
并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行。若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战:
线程的上下文切换问题、死锁问题、受限于硬件和软件的资源问题。
1、线程上下文切换
线程上下文切换简述:CPU通过时间片分配算法来循环执行任务,每个线程任务在正常情况下是被CPU轮询执行,当前任务执行完一个时间片后会切换到下一个线程任务。在切换前会保存上一个任务的执行状态,以便下次再切回这个任务时,知道任务执行到哪一步。任务从保存到再次加载的过程就是一次上下文切换。
及时在单核处理器也支持多线程执行,CPU给每个线程分配时间片来实现并发机制。时间片是CPU分配个线程的执行时间,CPU的时间片非常短(几十毫秒),所以CPU需要不停的切换线程,给我们的感觉就是多个线程在同时执行。
每次上下文切换都是需要消耗资源的,从而影响多线程执行的效率。类似于一个人同时在干多件事,每件事都干一点就又去做别的事,并且切换的时候都要记录一下,当前手头工作的节点。那么他同时进行的事越多,上下文切换的成本就越高,同时总体的效率就越低。
减少上下文切换的核心思想:尽可能减少线程数量、尽可能减少锁的使用;
无锁并发编程:线程竞争锁时会引发上下文切换,尽可能避免共享资源被多线程竞争的场景。可采用任务hash分段取模,不同线程处理各自的任务数据。
CAS算法:java的Atomic包中,底层代码使用的比较并替换(CAS)算法解决共享资源的竞争,避免使用锁。
最少线程数:避免创建过多的线程,导致大量线程处于闲置状态。造成任务少、线程多的场景,这样大量线程处于等待状态。
协程:尽可能将多个任务段放到一个线程里实现,在单线程里维持多个任务间的切换。
前俩种方式是避免使用锁,后俩种方式是尽可能减少线程数。
2、死锁
死锁的简述:就是俩个线程相互持有对方需要的资源,并且又同时等待对方释放资源,导致俩个线程相互僵持,谁也不肯让谁。
通常我们不会写出这样傻逼的代码,但是在实际业务中可能会出现,锁在释放时抛异常了导致锁没有正常释放,或者因为异常情况锁没有被成功释放锁等。
避免死锁的方法:
避免一个线程同时获取多个锁;
避免一个线程在锁内同时持有多个资源,通常一个锁之锁住一个资源。
尝试使用定时锁,超过有效时间后自动释放锁。
3、资源限制的挑战
简述:在并发编程中,受到硬件或软件资源的限制,从而导致程序的执行速度受到影响。
这个硬件和软件资源的限制是硬伤,既然没有高射炮,就不要打飞机,并发编程的前提是硬件和软件必须具备一定的标准。解决办法就就是提升硬件并且升级软件。
java并发编程--第一章并发编程的挑战的更多相关文章
- [Real World Haskell翻译]第24章 并发和多核编程 第一部分并发编程
第24章 并发和多核编程 第一部分并发编程 当我们写这本书的时候,CPU架构正在以比过去几十年间更快的速度变化. 并发和并行的定义 并发程序需要同时执行多个不相关任务.考虑游戏服务器的例子:它通常是由 ...
- Windows核心编程第一章.错误处理
Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...
- 第一章 C++编程基础
第一章 C++编程基础 1.1 如何撰写C++程序 赋值 assignment复合赋值 (compound assignment) += 函数(function)是一块独立的程序代码序列(code s ...
- 《C#并发编程经典实例》学习笔记-第一章并发编程概述
并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...
- Java 面向对象编程——第一章 初识Java
第一章 初识Java 1. 什么是Java? Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以其强安全性.平台无关性.硬件结构无关性.语言简 ...
- UNIX环境高级编程--第一章 UNIX基础知识
第一章 UNIX基础知识 1.2 UNIX体系结构 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...
- 读高性能JavaScript编程 第一章
草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...
- Go Web 编程 第一章 Web相关概念
第一章 Go与Web应用 Go学习群:415660935 1.1 Web应用 在计算机的世界里,应用(application)是一个与用户进行交互,并完成用户特定任务的软件程序.而Web应用则是部署在 ...
- windows核心编程-第一章 对程序错误的处理
第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...
随机推荐
- tasklist、taskkill命令使用
tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...
- vue-filters(过滤器)
局部过滤器: <html> <head> <title>vue</title> <meta charset="utf-8"&g ...
- Vue路由嵌套
Vue路由嵌套 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Python UDP 通信
UDP_Client.py import socket # 创建一个 UDP 套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DG ...
- MySQL: Can’t connect to MySQL server on (111 “Connection refused”)
1. Mysql连接问题 远程访问mysql或者通过docker访问宿主机mysql经常会碰到下面的问题: Can't connect to MySQL server on (111 "Co ...
- CentOS7安装CDH 第五章:CDH的安装和部署-CDH5.7.0
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- 【问题】Debian安装、配置sources.list、安装VMware Tools
Debian安装: 我采用的是纯命令行安装方式.具体安装过程网上一大堆,不介绍了.需要强调一点,那个SSH Server必须选,否则像XShell这样的客户端不能访问Debian. 配置sources ...
- Kinect for Windows SDK开发入门(四):景深数据处理 上
原文来自:http://www.cnblogs.com/yangecnu/archive/2012/04/04/KinectSDK_Depth_Image_Processing_Part1.html ...
- JQuery 遍历 操作数组 map、grep、filter 的区别
filter() 方法将匹配元素集合缩减为匹配指定选择器的元素.例如:改变所有 div 的颜色,然后向类名为 "middle" 的类添加边框:$("div"). ...
- bind(),call(),apply()
call .bind . apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了: call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 ob ...