一、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. JS实现当前选择日期是星期几

    使用到的日期插件是My97 Datepicker,这里通过onpicked方法触发getDay()方法,在getDay()方法中获取已选择的日期来判断是星期几. 插件下载地址:http://www.m ...

  2. elementui 树控件只隐藏第三集菜单

    <!-- 必须属性:default-expanded-keys node-key --> <el-tree :default-expanded-keys='idArr' node-k ...

  3. git基本命令总结

    介绍 上一篇博客介绍了git的基本使用方式,建议可以去阅读一下廖雪峰关于git的文章写的十分详细,并且通俗易懂,这篇博客主要是总结上一篇博客中用到的git命令,方便使用查询. git常用命令小结 gi ...

  4. SmartBinding实现DataSet与ListView的绑定及同步显示

    kbmMW 5.10.10发布了,这个版本解决了我提出的问题,当对DataSet增删记录时,ListView能够同步显示.下面看看具体的实现代码. 为了解决上面的问题,作者为IkbmMWBinding ...

  5. 【Hibernate】入门

    一.Hibernate框架的概述 1.1 什么是Hibernate 1.2 Hibernate优点 二.Hibernate的日志记录 三.Hibernate 入门程序 3.1 引入依赖(5.x版本) ...

  6. kafka学习遗留问题

    1.ZK在kafka中的作用 2.Kafka支持优先级队列么 未完待续

  7. js 执行完setTimeout再接着执行函数

    var counter = 0; function increase(){ var d = jQuery.Deferred(); var doIncrease = function() { if(co ...

  8. Codeforces 853B Jury Meeting

    题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ...

  9. prometheus 配置项注意事项

    1.job:metrics_path 如果是静态模式下配置job(statics),直接配置job的metrics_path选项是不生效的.需要同时在exporter端指定metrics_path.如 ...

  10. Vs2017 FrameWork EF Mysql 控制台应用

    1  运行环境   vs2017   Net FromWork 4.6.2  手动版 没有 ado.net 实体数据模型 2 NuGet  MySql.Data.Entity 6.10.9, MySq ...