1.简介

并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地运行,在并发编程的时候还需要面对一些众多的挑战。在进行并发编程的时候,如果希望通过多线程执行任务让程序运行得更快、会面临非常多的挑战。比如上下文的切换的问题、死锁的问题、以及所限制与硬件和软件环境的问题。

1.1 上下文切换

即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。
        上下文切换就是指CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是在切换的时候回保存上一个任务的状态,以便下一次切换回这个任务的时候,可以再加载这个任务的状态。所以任务从保存到加载过程称为上下文切换。
        解决上下文切换带来的开销:
        1. 无锁并发编程:用多线程再处理数据的时候,可以通过尽量避免使用锁,防止多线程竞争锁的时候,引起的上下文切换。
        2. CAS算法:硬件同步原语,Java的Atomic包下使用CAS算法来更新数据,而不需要加锁。
        3. 使用最少线程。避免创建不必要的线程,比如任务很少,但是你创建了大量的没有必要的线程。可以利用使用最少的线程来减少线程之间上下文切换的开销。
        4. 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务之间的切换

1.2  死锁

锁是一个用来防止多线程之间资源访问数据竞争的问题。锁是一个非常常用的工具,使用的场景也非常多,但是它也会带来一些问题,那就是可能造成死锁问题,一旦发生死锁问题,就会造成系统功能不可用。
        解决避免死锁带来的开销问题:
        1. 避免一个线程获得多个锁。
        2. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
        3. 尝试使用定时锁,使用tryLock(timeout)来替代使用内部的锁机制。

1.3 资源限制

资源限制就是指在进行并发编程的时候,程序的执行速度受限制于计算机硬件资源或者软件资源。例如,服务器的带宽是2MB/s,某个资源的下载速度是1MB/s,这个时候你启动10个线程去下载资源,下载速度也不会达到10MB/s。资源限制可能会引发很多问题,比如说因为资源受到限制,仍然线性地运行,这个时候程序不仅不会加快执行,反而会更加缓慢,因为增加了上下文的切换时间和资源的调度的时间。
        解决资源限制的问题:
        1.对于硬件资源的限制,可以使用集群来并行地执行程序。
        2.对于软件资源的限制,可以考虑使用线程池来讲资源复用来使用。

Java高并发编程(一):并发编程的挑战相关推荐

  1. Java高并发编程(二):Java并发机制的底层实现机制

    Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...

  2. Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...

  3. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

    前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...

  4. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  5. java 并发框架源码_某网Java并发编程高阶技术-高性能并发框架源码解析与实战(云盘下载)...

    第1章 课程介绍(Java并发编程进阶课程) 什么是Disruptor?它一个高性能的异步处理框架,号称"单线程每秒可处理600W个订单"的神器,本课程目标:彻底精通一个如此优秀的 ...

  6. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  7. java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战

    Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...

  8. 阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

    前言 有人调侃我们说: 程序员不如送外卖.送外卖是搬运食物,自己是搬运代码,都不产出新的东西-- 透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险-- 想跳槽,但是更高的平台难进,同 ...

  9. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  10. 29W 字总结阿里 Java 高并发编程:案例 + 源码 + 面试 + 系统架构设计

    下半年的跳槽季已经开始,好多同学已经拿到了不错的 Offer,同时还有一些同学对于 Java 高并发编程还缺少一些深入的理解,不过不用慌,今天老师分享的这份 27W 字的阿里巴巴 Java 高并发编程 ...

最新文章

  1. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法
  2. 信号源的ALC环路介绍
  3. 解决 TortoiseGit 诡异的 Bad file number 问题(转)
  4. vsts~CI/CD实现自动化编译
  5. JDK9新特性实战:简化流关闭新姿势
  6. javascript时间戳和日期字符串相互转换
  7. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)
  8. 详解Oracle的unlimited tablespace系统权限
  9. 图像增强——Roberts算子、Sobel算子、Prewitt算子、Laplace算子
  10. 阿里云部署RSSHub踩坑笔记
  11. SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x84‘ for column ‘content‘
  12. 分布式子系统之间通讯
  13. 【机器人学】平面2R机器人(六)——MATLAB仿真
  14. netty源码分析7-NioEventLoop-run方法疑难点
  15. 【2022应届生的入职感悟】
  16. php 生成8位数唯一的激活码
  17. APP第11篇 微信小程序测试
  18. sqlserver2008R2在配置复制分发时报错:在执行xp_cmdshell的过程中出错
  19. activePerl下载网址
  20. 一个请求到响应的详细过程

热门文章

  1. SVN服务器搭建和使用教程
  2. 33:把数组排成最小的数
  3. Erlang入门(二)—并发编程
  4. hdu 3392 Pie
  5. IPSEC造成网络Destination host unreachable
  6. SQL时间格式转换CONVERT_GETDATE()
  7. Python程序设计之如何设置统一编码格式
  8. JVM怎么判断对象是否存活
  9. 005_logback介绍
  10. 013_下载静态资源