并发
Contents
💠
💠 2024-09-06 11:36:43
并发
并发编程的理论基础 无关语言
同步
这种对
共享变量, 共享内存,共享资源
进行访问的程序片段叫做临界区
, 代码在进入临界区之前一定要做好同步或者互斥的操作。
- 例如在Java JDK中, 已经对线程的同步做了封装了, 对于生产者-消费者问题,可以直接使用BlockingQueue
- 非常简单, 完全不用你去考虑这些 wait, signal, full, empty
异步
Future promise async 与 await
线程和进程
协程
锁
锁是用来锁临界区资源的 , 而不是锁代码块, 锁函数. 那么在Java中:
synchronized
锁住的是不同线程对同一个对象的访问 知乎: 锁代码块和锁方法有啥区别啊?
死锁
- 什么是死锁
- 死锁的四个必要条件
- 资源互斥
资源
指线程对已经获取到的资源进行排它性使用,即该资源同时只由一个线程占用。如果此时还有其他线程请求获取该资源,则请求者只能等待,直至占有资源的线程释放该资源。
- 不可剥夺
资源
指线程获取到的资源在自己使用完之前不能被其他线程抢占,只有在自己使用完毕后才由自己释放该资源。
- 持有资源与请求新资源
线程
指一个线程已经持有了至少一个资源,但又提出了新的资源请求,而新资源已被其他线程占有,所以当前线程会被阻塞,但阻塞的同时并不释放自己已经获取的资源。
- 环路等待
线程
指在发生死锁时,必然存在一个线程—资源的环形链,即线程集合{T0,T1, T2, …, Tn}中的T0正在等待一个T1占用的资源,T1正在等待T2占用的资源,……Tn正在等待已被T0占用的资源。
- 资源互斥
并发实践
在抽象角度考虑并发
在过去的30年里,计算机的性能是在摩尔定律的推动下,从现在开始,这将由Amdahl定律决定。编写代码,有效地利用多个处理器可以是非常具有挑战性的。" – Doron Rajwan
进行多核多服务器时代,并行并发模式更是对程序员的挑战,现在所谓的Thread Programmer世界上也是为数不多,因为线程表面上好像很容易,但在实际应用中真正应付大负荷运算时,原来的线程设计方案漏洞百出。
并发concurrency属于问题域(problem domain), 并行parallelism属于( solution domain)。 并行和并发的区别在于有无状态,并行计算适合无状态应用,而并发解决的是有状态的高性能; 有状态要着力解决并发计算,无状态要着力并行计算
并发主要是要解决资源争夺,并发一般发生在数据聚合的地方,只要有聚合,就有争夺发生,传统解决争夺的方式采取线程锁机制,这是强行对CPU管理线程人为干预,线程唤醒成本高,新的无锁并发策略来源于Java的NIO或Node.js,通过队列+单线程操作资源的方式巧妙避免了多线程,由于只有一个线程,在多核情况下增加了并行计算的机会。
并发模型分两种,并发基础线程和并发组件模型,并发组件模型让使用者接触不到基础线程概念,是一种简化。作为一个高级集成架构师,应该在程序范式的高级层次定义并发,基于组件级别的并发,并且尽可能地避免涉及线程概念以及线程池等底层概念。
实现并发的途径有两种,基于线程和基于事件 基于线程与基于事件的并发编程之争
C100K
Author Kuangcp
LastMod 2019-01-16