一:并发编程面临的挑战
(1)上下文切换问题
(2)死锁问题
(3)受限于硬件和软件资源的问题
&&注意点:并发编程的累加操作不超过百万次,多线程的执行速度要比单线程慢。因为线程有创建和上下文切换的开销。
二:如何减少上下文切换?
(1)无锁并发编程。
--->多线程竞争锁时,会引起上下文切换,所以多线程处理数据时候,可以用一些办法避免使用锁。
--->如将数据id按照hash算法取摸分段,不同线程处理不同段的数据。
(2)CAS算法
--->java的Atomic包使用了CAS算法更新数据,而不需要加锁。
(3)使用最少线程
--->避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态
(4)协程
--->在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
三:如何避免多线程死锁?
(1)避免一个线程同时获取多个锁
(2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
(3)尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
(4)对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
四:如何解决资源限制?
(1)什么是资源限制
--->硬件资源限制有带宽的上传/下载速度。
--->硬盘的读写速度和cpu处理速度。
--->数据库的连接数和socket连接数
(2)资源限制引发的问题
--->并发编程中,将代码执行速度加快的原则是将代码中串行的部分变成并发执行。
--->由于受限于资源,所设计的并发其实仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢,因为增加了上下文切换和资源调度的时间。
(3)如何解决资源限制的问题。
--->对于硬件资源限制,可以考虑使用集群并行执行程序。单机有限,多机运行。比如:集群。
--->对于软件资源的限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和socket连接复用。
--->根据不同的资源限制调整程序的并发度,比如下载文件程序依赖两个资源--带宽和硬盘的读写速度。有数据库操作时,设计数据库连接数,如果sql语句执行非常快,而线程的数量比数据库的连接数大很多,某些线程会被阻塞,等待数据库连接。

多线程之:并发编程面临的挑战相关推荐

  1. IOS多线程之Block编程

    1 什么是block iOS SDK 4.0開始,Apple引入了block这一特性.字面上说,block就是一个代码块.可是它的奇妙之处在于在内联(inline)运行的时候(这和C++非常像)还能够 ...

  2. Java并发编程艺术

    一.并发编程面临的挑战 并发编程的目的是为了让程序运行更快,但并不是启动多线程就能让程序最大限度地并发执行.还会面临上下文切换.死锁.软硬件的资源限制等问题. 上下文切换 CPU通过给每个线程分配CP ...

  3. java并发编程的艺术-学习-1

    第一章 并发编程的挑战 目的:让程序运行更快 并发编程面临的挑战:上下文切换.死锁.硬件和软件的资源限制 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片 ...

  4. Java 并发编程概念深入理解

    why-为什么要有多线程? 单线程情况下: 在有IO操作的情况下,线程是在阻塞的,cpu什么事情也不干,直到IO操作完成 如果没有IO操作且是单核cpu,可以是单线程 多线程的情况下: 有IO操作的情 ...

  5. 漫谈并发编程:Actor模型

    0x00 前言 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到java.util.concurren ...

  6. actor 模型 锁 java_漫谈并发编程:Actor模型

    0x00 前言 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到 java.util.concurre ...

  7. Java开发中遇到具有挑战的事_Java并发编程的挑战:遇到的问题及如何解决

    并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题.死 ...

  8. Java高并发编程(一):并发编程的挑战

    1.简介 并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地运行,在并发编程的时候还需要面对一些众多的挑战.在进行并发编程的时候,如果希望通过多线程执行任务让程序运行 ...

  9. 并发编程的目的和挑战

    并发编程的目的与挑战 并发编程的目的是为了让程序运行得更快.启动更多的线程并不一定就能让程序最大限度地并发执行. 希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战.比如: 上下文切换的问题死 ...

最新文章

  1. 面向对象原则之GOF是招式,九大原则才是精髓
  2. 列举ospf的5种报文类型_这5种“专升本”你都知道吗?那个含金量更高呢?报考如何选择?...
  3. -bash: /tyrone/jdk/jdk1.8.0_91/bin/java: cannot execute binary file
  4. spark读取文件源码分析-1
  5. WPF 基础控件之 GroupBox样式
  6. 5.Underfitting and Overfitting
  7. java常用的正则表达式
  8. opencv python 调用摄像头_python+opencv实现摄像头调用的方法
  9. 联想17TV语音遥控教程 语音点播更方便
  10. swt/jface第六天 table
  11. ArcGIS三维建模(三)
  12. CodeForces - 988D(思维STL)
  13. msg1500说明书_MSG1500刷机笔记
  14. OBCE首位认证 实力与颜值并存 | 90后技术宅郑皓嘉的通关之路
  15. Linux中解除带锁的文件夹
  16. 关于微信公众号支付接口开发遇到的奇葩问题,始终返回get_brand_wcpay_request:fail。
  17. Spark【案例】实现黑名单实时过滤
  18. 图像处理之Matlab图像读取
  19. Ordinal numeral
  20. 安装操作系统的方法?

热门文章

  1. 课后作业-阅读任务-阅读提问-3
  2. 哈啰顺风车成立5亿元“顺风绿色出行基金”
  3. 一张图看懂React生命周期
  4. 【每日学习Mybatis中基础】trim标签使用
  5. C++中public、protected、private的差别
  6. ntfs for Mac无法填写序列号怎么解决
  7. 在Digital Ocean上的MongoDB
  8. C#筛法求出范围内的所有质数
  9. 做了一个系列的Android开发教程列表
  10. Oracle数据库日常维护