2.3 资源限制的挑战

什么是资源限制

资源限制指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。

硬件资源包括:带宽的上传下载速度、硬盘读写速度和CPU的处理速度等

软件资源包括:线程池大小、数据库的连接数等

资源限制引发的问题

在并发编程中,代码执行速度加快的原则是将代码中的串行部分变成并行执行,但有可能由于资源限制问题,导致程序仍按串行执行,此时程序不仅不会变快,反而更慢,因为增加了上下文切换和资源调度的时间。

如何解决资源限制的问题

对于硬件资源限制:考虑使用集群方式并行执行程序。

对于软件资源限制:考虑使用资源池将资源复用,例如数据库连接池等

资源限制情况下进行并发编程

根据不同的资源限制调整程序的并发度。

3. 应该了解的概念

3.1 同步VS异步

同步和异步通常用来形容一次方法调用。同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。比如,在超时购物,如果一件物品没了,你得等仓库人员跟你调货,直到仓库人员跟你把货物送过来,你才能继续去收银台付款,这就类似同步调用。而异步调用了,就像网购,你在网上付款下单后,什么事就不用管了,该干嘛就干嘛去了,当货物到达后你收到通知去取就好。

3.2 并发与并行

并发和并行是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。实际上,如果系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能通过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出现在拥有多个CPU的系统中。

3.3 阻塞和非阻塞

阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。

3.4 临界区

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每个线程使用时,一旦临界区资源被一个线程占有,那么其他线程必须等待。

4.并发编程的三大特性

并发编程有三大特性:原子性、可见性、有序性。

原子性:是指在一次操作或多次操作中,要么所有的操作都得到执行,要么都不执行。【类似于事务】

JMM只保证了基本读取和赋值的原子性操作

多个原子性操作的组合不再是原子性操

可以使用synchronized/lock保证某些代码片段的原子性

对于int等类型的自增操作,可以通过java.util.concurrent.atomic.*保证原子性

可见性:是指一个线程对共享变量进行了修改,其他线程可以立即看到修改后的值。

有序性:是指代码在执行过程中的先后顺序是有序的。【Java编译器会对代码进行优化,执行顺序可能与开发者编写的顺序不同(指令重排)】

并发编程时,保证三大特性的方式有三种:

1、使用volatile关键字修饰变量

当一个变量被volatile关键字修饰时,对于共享变量的读操作会直接在主存中进行,对于共享变量的写操作是先修改本地内存,修改结束后直接刷到主存中。(未被volatile修饰的变量被修改后,什么时候最新值会被刷到主存中是不确定的)

2、使用synchronized关键字修饰方法或代码块

synchronized关键字能保证同一时刻只有一个线程获得锁然后执行同步方法,并且确保锁释放之前,会将修改的变量刷入主存。

3、使用JUC提供的显式锁Lock

Lock能保证同一时刻只有一个线程获得锁然后执行同步方法,并且确保锁释放之前,会将修改的变量刷入主存。

最后,本文主要对Java并发编程开发需要的知识点作了简单的讲解,这里每一个知识点都可以用一篇文章去讲解,由于篇幅原因不能对每一个知识点都详细介绍,我相信通过本文你会对Java的并发编程会有更近一步的了解。如果您发现还有缺漏或者有错误的地方,可以在评论区补充,谢谢。

java并发编程入门_Java并发编程入门,看这一篇就够了相关推荐

  1. 并发量,QPS,TPS,看这一篇就够了

    目录 引子 饭店问题 网站 类比饭店分析 性能测试 软件性能测试的基本概念和计算公式 一.软件性能的关注点 二.软件性能的几个主要术语 引子 饭店问题  饭店优化 网站 类比饭店分析 当一条请求从客户 ...

  2. 【Java 8系列】Stream详解,看这一篇就够啦

    热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Lambda 表达式,一看就废 [Java 8系列]Java日期时间的新主宰者:LocalDa ...

  3. Lua脚本语言学习总结 入门、复习Lua语言看这一篇就够了

    文章目录 Lua 概念 特性 应用场景 Lua的安装 Lua的语法 第一个Lua程序 Lua的注释 标识符 关键字 运算符 全局变量&局部变量 Lua数据类型 nil boolean numb ...

  4. Vue3 核心技能从入门到难点攻破,看这一篇就够了!

    在 Vue2.0 时代,国内大厂的前端开发框架,几乎清一色偏向 React.因为对于业务成熟的公司而言,一个项目,可能会包含很多非侵入式的代码和服务,并不是功能实现了就万事大吉. 但随着 Vue3.0 ...

  5. .net java 泛型_Java高级特性泛型看这一篇就够了

    作者:qwer1030274531 出自:ITPUB博客 1.为什么我们需要泛型? 通过两段代码就可以知道为什么需要泛型 /*** * 没有泛型的时候实现加法 */public class NonGe ...

  6. java.acp是什么,ACP是什么?看这一篇就够啦

    随着国内PMP的考证热潮越来越火爆,越来越多的人加入了考证的大队.ACP也逐渐地被人们所熟知.虽然在国内,ACP远远没有PMP那么火爆,但是ACP在国际上的含金量也是蛮高的.在我国,每年也会有很多人参 ...

  7. serviceloader java_【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  8. OpenStack入门科普,看这一篇就够啦

    OpenStack入门科普,看这一篇就够啦 科技百分百 2019-07-06 10:06:00 作者 | 小枣君 来源 | 鲜枣课堂 大家好,我是小枣君. 最近几年,OpenStack这个词开始频繁出 ...

  9. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  10. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

最新文章

  1. 果园机器人的课文_小学三年级下《果园机器人》课文
  2. codevs 1047 邮票面值设计
  3. hdu A Simple Math Problem
  4. [SQL] 查找数据库中含有某字段的所有表
  5. C语言再学习 -- 查看版本及内核信息(转)
  6. zigbee 常规配置
  7. Sencha 自定义组件函数回调
  8. 【POJ - 2965】The Pilots Brothers' refrigerator(暴力枚举,思维)
  9. 【POJ - 2373】Dividing the Path(单调队列优化dp)
  10. c语言 为什么i%3cn 1,c语言中n+1个基础且容易出错的知识点
  11. 7 分钟全面了解位运算
  12. c#基础(一)之内存管理
  13. windows系统vbs脚本 恶搞关不掉的窗口 以及解决办法
  14. Ubuntu16.04系统 GPU1070Ti下搭建Caffe++Nvidia显卡驱动+Cuda9.0+Cudnn7.0.5
  15. python主页面_使用Wagtail CMS使用Python检测父页面和子页面...
  16. 费曼技巧:一张白纸提高学习效率
  17. 116.【SpringBoot和Vue结合-图书馆管理系统】
  18. nodeBB项目开发中遇到的错误(nodeBB系列二)
  19. EHW_DIMM分类与比较
  20. python代码入门教程_Python入门教程丨1300多行代码,让你轻松掌握基础知识点

热门文章

  1. html5 摇号,85万人参与5月小客车指标摇号!你中签了吗?快点进来查一查
  2. numpy生成数组的函数
  3. 微软xcloud服务器,微软云服务XCloud测试开启 10Mbps以上即可畅玩
  4. NS版暗黑破坏神3金手指开发教程(10)
  5. USB至串口TTL转接设备及Console线
  6. utils.general详解1
  7. 当我成为独立开发者我在干什么
  8. php 内容写入文件内容_PHP使用内置函数file_put_contents写入文件及追加内容的方法...
  9. 狗屁不通文章生成器写的文章,评分软件赞不绝口
  10. DevExpress v21.1正式版上线——WinForm篇