一、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. eclipse调试之edit source lookup path解决方案

    转自:https://blog.csdn.net/zkn_CS_DN_2013/article/details/48731133

  2. 案例:selenium实现登录处理弹窗

    func.py https://www.cnblogs.com/andy9468/p/10899508.html main.py中 # 导入webdriver import os import tim ...

  3. Django drf:幂等性

    一.什么叫做幂等性 用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用.举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络 ...

  4. [Python] Codecombat 攻略 Sarven 沙漠 (1-43关)截止至36关

    首页:https://cn.codecombat.com/play语言:Python 第二界面:Sarven沙漠(43关)时间:4-11小时内容:算术运算,计数器,while循环,break(跳出循环 ...

  5. Paper Reading:ION

    Inside-Outside Net (ION) 论文:Inside-Outside Net: Detecting Objects in Context with Skip Pooling and R ...

  6. python+mysql:实现一千万条数据插入数据库

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

  7. ASP.NET Core 2.0身份和角色管理入门

    见  https://blog.csdn.net/mzl87/article/details/84892916 https://www.codeproject.com/Articles/1235077 ...

  8. TCP首部介绍

    每个T C P段都包含源端和目的端的端口号,用于寻找发端和收端应用进程.这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个T C P连接.有时,一个I P地址和一个端口号也称为一个 ...

  9. http文件服务器上传与下载功能

    https://www.cnblogs.com/liferecord/p/4843615.html

  10. Ubuntu Linux使用sudo命令搭建java环境

    搬运stackoverflow 注意,以下所有命令需要在root权限下执行 1. 在Ubuntu下打开终端命令或用ssh连接到linux. 2. 更新仓库(只有Ubuntu17.4及以下系统可用): ...