并发编程
Amdahl's Law:每个程序都分为串行与并行部分,降低串行的比重,可提高程序的效率。
进行多核多服务器时代,并行并发模式更是对程序员的挑战,现在所谓的Thread Programmer世界上也是为数不多,因为线程表面上好像很容易,但在实际应用中真正应付大负荷运算时,原来的线程设计方案漏洞百出。
并发concurrency属于问题域(problem domain), 并行parallelism属于( solution domain)。并行和并发的区别在于有无状态,并行计算适合无状态应用,而并发解决的是有状态的高性能; 有状态要着力解决并发计算,无状态要着力并行计算,云计算要能做到这两种计算自动伸缩扩展。
并发主要是要解决资源争夺,并发一般发生在数据聚合的地方,只要有聚合,就有争夺发生,传统解决争夺的方式采取线程锁机制,这是强行对CPU管理线程人为干预,线程唤醒成本高,新的无锁并发策略来源于Java的NIO或Node.js,通过队列+单线程操作资源的方式巧妙避免了多线程,由于只有一个线程,在多核情况下增加了并行计算的机会。
并发模型分两种,并发基础线程和并发组件模型,并发组件模型让使用者接触不到基础线程概念,是一种简化。作为一个高级集成架构师,应该在程序范式的高级层次定义并发,基于组件级别的并发,并且尽可能地避免涉及线程概念以及线程池等底层概念。
实现并发的途径有两种,基于线程和基于事件,基于线程与基于事件的并发编程之争。
数据库
什么是数据库ACID
业界最大谎言:大部分关系数据库并不真的支持ACID
Java持久锁总结
数据库系统并发控制原理
PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式
最终一致性其实比MVCC简单
线性化与串行化比较
ACID和CAP的详尽比较
更多事务专题
替代传统事务的并发建议
多线程并发
多线程常见面试题
Java多线程设计编程
Java多线程并发最佳实践
Java Collection集合面试题
什么使得并行编程变得很难?
多线程让可扩展性走进了死胡同
JVM内存模型和性能优化
jvm是如何处理锁的?
Java三种常见锁性能对比
可扩展的并发架构
并发应用中不可变数据结构
Java硬件事务内存
Doug Lea谈JDK7的Fork/Join框架
线程池与ForkJoin比较
使用future实现内置异步API
不可变真的意味线程安全?
不变性immutablity设计
无堵塞的并发编程
actor并发模型&基于共享内存线程模型
使用Java8的Lambda简化ReadWriteLock
Java 8 LongAdders
Java 8的StampedLocks
有关Java其他多线程方面文章。点按进入
ExecutorService - 10个技巧和窍门
Java8的CompletableFuture
多线程并发编程中的初始化问题
并发教程与源码
死锁详解研究
隐藏的线程死锁
单独写原则
semaphore使用案例源码
JPA/Hibernate:基于版本的乐观锁并发控制
数据库死锁问题
什么是数据库ACID?
针对多核可扩展的计数器源码下载
简单轻量池Pool实现源码下载
使用Guava Striped类实现高并发源码
什么时候使用Reentrant锁
非堵塞异步Java 8 和 Scala的Try/Success/Failure
使用Executors 和 ThreadPoolExecutor实现Java线程池案例
使用Guava为并发应用实现基于对象的微锁
Hazelcast入门教程
Java并发随机数的产生
Java8流和forkjoin并行计算
Disruptor
Disruptor专题
LMAX架构
如何让Java以光的速度跨线程通信?
NIO
Reactor模式和NIO
Java NIO原理和使用
Netty原理和使用
用Java NIO开发高性能聊天系统
Vert.x编程
Reactive与Actors
事件驱动编程
go reactive宣言
Rx (Reactive Extensions)介绍
RxJava教程
RxJava专题
AKKA框架
Actors模型
Reactive编程专题
Goroutine与Channel
Actor模型和CSP模型的区别
Go语言Goroutine与Channel内存模型
Go语言是彻底的面向组合的并发语言
Go 1.5的并发特性与案例(事件与转账)
Go语言专题
Rust语言并发模型
参考相关: