并发编程

  在过去的30年里,计算机的性能是在摩尔定律的推动下,从现在开始,这将由Amdahl定律决定。编写代码,有效地利用多个处理器可以是非常具有挑战性的。" -Doron Rajwan  

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: CyclicBarrier解释

有关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语言并发模型

参考相关:

并行计算

并发策略可以解决延迟

领域事件和EventSourcing

并发讨论专题

异步编程模型

性能主题

高性能

性能调优

性能测试

EDA