-
Notifications
You must be signed in to change notification settings - Fork 20
Concurrency
目录 start
目录 end|2020-11-16 12:11|
并发编程的理论基础 无关语言
这种对
共享变量, 共享内存,共享资源
进行访问的程序片段叫做临界区
, 代码在进入临界区之前一定要做好同步或者互斥的操作。
- 例如在Java JDK中, 已经对线程的同步做了封装了, 对于生产者-消费者问题,可以直接使用BlockingQueue
- 非常简单, 完全不用你去考虑这些 wait, signal, full, empty
-
学习参考 Kotlin Go Java(库) 的协程实现
锁是用来锁临界区资源的 , 而不是锁代码块, 锁函数. 那么在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,通过队列+单线程操作资源的方式巧妙避免了多线程,由于只有一个线程,在多核情况下增加了并行计算的机会。
并发模型分两种,并发基础线程和并发组件模型,并发组件模型让使用者接触不到基础线程概念,是一种简化。作为一个高级集成架构师,应该在程序范式的高级层次定义并发,基于组件级别的并发,并且尽可能地避免涉及线程概念以及线程池等底层概念。
实现并发的途径有两种,基于线程和基于事件 基于线程与基于事件的并发编程之争
-
【 Algorithm 】
-
【 Blog 】
-
【 C 】
-
【 Database 】
-
【 Distributed 】
-
【 FrontEnd 】
- 【 FrontEnd/Frame 】
- 【 FrontEnd/Node 】
- Font
- Hexo
- JavaScript
- LearnPS
- ResponseCode
- SVG
- ViewSolution
- extjs学习笔记
-
【 Functional 】
-
【 Go 】
-
【 Groovy 】
-
【 Java 】
- 【 Java/AdvancedLearning 】
- 【 JavaBasic 】
- 【 JavaCache 】
- 【 JavaCollection 】
- 【 JavaConcurrency 】
- 【 JavaMap 】
- Annotation
- ClassFile
- Collection
- Concurrency
- Deploy
- Exception
- ExtendsAndInterface
- Generics
- IO
- JDBC
- JDKAndJRE
- JMX
- JVM
- Java11
- Java7
- Java8
- JavaNetwork
- JavaReleaseVersion
- JavaWeb
- JvmPerformance
- MQ
- MultipleLanguage
- Proxy
- Reflection
- Serialize
- SyntaxAndType
- Thread
- WebPerformance
- 【 Java/Android 】
- 【 Java/Ecosystem 】
- 【 Java/MSA 】
- 【 Java/Spring 】
- 【 Java/TemplateEngine 】
- 【 Java/Test 】
- 【 Java/Tool 】
- 【 Java/thread 】
- AlibabaJavaStandard
- DesignPattern
- HashMap解析
- Java-NIO
- Java虚拟机
- Log
- MIS
- Quartz
- RESTful
- WebSocket学习笔记
- ZooKeeper学习笔记
- android学习笔记
- 【 Java/AdvancedLearning 】
-
【 Kotlin 】
-
【 Linux 】
- 【 Linux/Alpine 】
- 【 Linux/Arch 】
- 【 Linux/Base 】
- 【 Linux/Centos 】
- 【 Linux/Container 】
- 【 Linux/Debian 】
- 【 Linux/Tool 】
- JavaDevInit
- Linux系统学习
-
【 MyBlog 】
-
【 Python 】
- 【 Python/Tool 】
- Python
- PythonConcurrent
- PythonGUI
- PythonGame
- PythonNet
- PythonOffices
- PythonWeb
- Python基础
- Python核心学习
-
【 Reactive 】
-
【 Rust 】
-
【 Scala 】
-
【 Script 】
-
【 Skills 】
- 【 Skills/Application 】
- 【 Skills/CS 】
- 【 Skills/Cache 】
- 【 Skills/Councurrency 】
- 【 Skills/DevOps 】
- 【 Skills/Document 】
- 【 Skills/Ecology 】
- 【 Skills/Network 】
- 【 Skills/Search 】
- 【 Skills/SoftwareEngineering 】
- 【 Skills/Spider 】
- 【 Skills/Test 】
- 【 Skills/Vcs 】
- 【 Skills/Work 】
- AppManual
- CelebrityQuotes
- Miscellaneous
- Platform
- Problem
- Protobuf
- RegularExpression
- SoftwareDesignEngineer
- Website
-
【 Windows 】