1. 临界区加排他锁(Go sync.Mutex.Lock())linux
若是并发量大,锁竞争激烈,会致使性能开销大数据库
2. 读多写少场景,使用读写锁(Go sync.Mutex.RLock())编程
支持并发读,但写锁会block住读和写,读多场景性能会好不少多线程
3. 对计数使用CAS操做(Go sync.atomic.CompareAndSwapInt64())并发
CAS由CPU原子指令实现。是一种无锁结构,因为消耗的CPU指令周期少,性能要优于锁结构异步
4. actor并发模型性能
Erlang和scala akka使用的并发模型。通常并发线程通讯有两种实现模型:共享内存和消息传递。共享内存最大的问题在于条件竞争,还容易产生死锁等问题。atom
actor是一种消息传递实现并发模型,定义了actor,每一个actor有一个mail box,负责接收消息。消息只能顺序的放到邮箱中,由actor处理线程
5. CSP模型scala
Golang使用的是CSP并发模型,与actor惟一区别是没有mail box。代替使用channel进行消息传递,相似于linux的命名管道
6. SMT软件事务内存
参考数据库事务的实现,保证操做的ACID特性。经过内存日志实现对共享资源操做的原子性,commit或abort。但因为维护日志的开销,该模型的性能要低于锁。但其优点是能够极大简化多线程编程模型,不会产生诸如死锁等问题。
上述actor模型中,actor内部持有状态,但异步消息传递意味着不能提供一致性的调用过程。对于交易系统,如银行帐户存款和提款的操做过程是须要是原子的,这可能须要跨两个帐户调用过程是一个原子过程,能够由SMT实现