一、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. tasklist、taskkill命令使用

    tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...

  2. vue-filters(过滤器)

    局部过滤器: <html> <head> <title>vue</title> <meta charset="utf-8"&g ...

  3. Vue路由嵌套

    Vue路由嵌套 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. Python UDP 通信

    UDP_Client.py import socket # 创建一个 UDP 套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DG ...

  5. 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 ...

  6. CentOS7安装CDH 第五章:CDH的安装和部署-CDH5.7.0

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  7. 【问题】Debian安装、配置sources.list、安装VMware Tools

    Debian安装: 我采用的是纯命令行安装方式.具体安装过程网上一大堆,不介绍了.需要强调一点,那个SSH Server必须选,否则像XShell这样的客户端不能访问Debian. 配置sources ...

  8. Kinect for Windows SDK开发入门(四):景深数据处理 上

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/04/04/KinectSDK_Depth_Image_Processing_Part1.html ...

  9. JQuery 遍历 操作数组 map、grep、filter 的区别

    filter() 方法将匹配元素集合缩减为匹配指定选择器的元素.例如:改变所有 div 的颜色,然后向类名为 "middle" 的类添加边框:$("div"). ...

  10. bind(),call(),apply()

    call .bind . apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了: call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 ob ...