对于一个高并发的实时系统,低延迟-高吞吐是设计首要考虑的问题,对称多处理器为程序并发提供了硬件平台,当在多线程处理环境中,对一些公共资源的读写难免要互斥,谁获得锁,是随机的,其他的CPU core只能在spinlock下不停的尝试,耗费资源,我们应该将资源用于我们业务系统, 不能把性能浪费在不停的等待,尝试,或者等待操作系统“翻牌子”的无用操作上。

当我们试图建立一个高度可扩展的系统,最大的一个限制是:对同一个资源会有多个竞争写操作。 计算机科学归结为2个基本的方法:一是提供资源的互斥锁,另一种是采取乐观的策略。

Mutual Exclusion互斥

  相互排斥是某个时间对同一个受保护资源保证只有一个写操作,这是通过锁策略实施的。锁策略需要一名仲裁员,通常这个仲裁员是来自操作系统内核,当发生争夺时它决定谁能获得锁,以及以什么顺序获得。这是一个非常昂贵的过程,通常我们需要更多的CPU循环实现我们的业务逻辑,而不是做这些“家务事”。对于那些等待进入临界区,提前进行Mutual的还必须排队,排队效果(Little’s Law)导致延迟变得难以预测,最终制约了吞吐量。这是一种堵塞Blocking做法。

Optimistic Concurrency Control乐观并发锁

  比如Hibernate或JPA都有乐观锁策略,见:JPA/Hibernate:基于版本的乐观锁并发控制,包括MongoDB的乐观锁

  乐观的策略是:保留有数据的一个副本,当修改数据时,如果在此期间原本尚未发生变化,那么复制数据的变化覆盖原本。如果在此期间原本发生的变化,你重复这个过程,直到成功为止。

  这种重复过程中增加争夺可能性,会造成排队的效果,就如同相互排斥锁一样。现实中源代码控制系统如Subversion或CVS都在使用这种算法。乐观的策略能够在争夺数据情况下使用,但在争夺一些硬件资源下却工作得不怎么好,因为你不能获得一个硬件资源的副本! 也许只有通过CAS指导硬件完成执行原子数据的变化。

笔记注:它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最早是由孔祥重(H.T.Kung)教授提出[1]

乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。

转载于:https://blog.51cto.com/lth2015/1684203

单独写原则Single Writer Principle相关推荐

  1. 软件设计原则(二)单一职责原则 -Single Responsibility Principle

    SRP,Single Responsibility Principle: There should never be more than one reason for a class to chang ...

  2. 单一职责原则(Single Responsibility Principle)

    在软件设计.编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码.SOLID是五个基本原则的首字母.这五个原则如下: Single responsibility Open–c ...

  3. 设计模式原则篇:(1)单一职责原则--Single Responsibility Principle

    上篇文章提及到设计模式中应遵循的设计原则,并且列出了设计模式中应当遵循的六大原则. 次篇文章主要讨论单一职责原则. 单一职责原则(SRP): 不要存在多于一个导致类变更的原因.简单的讲,就是一个类或接 ...

  4. 单一指责原则(Single Responsibility Principle) SRP

    using System; using System.Collections.Generic; using System.Text;namespace SingleResponsibilityPrin ...

  5. 围观设计模式(1)--单一职责原则(SRP,Single Responsibility Principle)

    沉寂了一个月的时间,仔细学习了下设计模式,从本篇博文开始陆续更新设计模式系列的文章,我给它起了个有意思的名字叫做:"围观"设计模式,当然围观是加引号的,我写博文分享的目的一方面是将 ...

  6. Single Responsibility Principle (SRP) - OO设计的单一职责原则

    前言 Robert C. Martin氏为我们总结了在面向对象的设计(OOD)中应该遵循的原则,这些原则被称为"Principles of OOD",关于"Princip ...

  7. 设计模式-设计原则(Design Principle)

    本文由@呆代待殆原创,转载请注明出处. 写在前面:所谓设计原则并不是一定要遵守的法则,只是一种建议,因为保持这些原则本身会有一定代价,若是这些代价超过了带来的好处就得不偿失了,所以一切还是以简单为准. ...

  8. 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...

  9. 开闭原则(Open-Closed Principle,OCP)

    2 开闭原则(Open-Closed Principle,OCP) 2.1 什么是开闭原则     开闭原则是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一, ...

最新文章

  1. 9.Matlab中的repmat,clock,rand以及seed,state,twister参数
  2. [Usaco2009 Feb]Revamping Trails 道路升级
  3. XP系统和Sever2003系统现实定时开关机
  4. 写论文时的一些高大上词句
  5. 微服务治理实践:服务契约
  6. VS静态库和动态库的区别
  7. FreeEIM 在盛大的开幕仪式结束之后
  8. qpython能使用json吗l_[python] 详解Python在使用JSON时需要注意的编码问题
  9. 从零开始学习前端JAVASCRIPT — 7、JavaScript基础EVENT
  10. 浙大 PAT b1040
  11. bootstrap模态框和select2合用时input无法获取焦点
  12. 第二季-专题11-世界一下变大了-MMU
  13. 计算机网络暗地里范围,《计算机网络应用技术教程》期中试题.doc
  14. 【C++】虚表指针和虚函数表
  15. word打开wps文件乱码_word文件打不开,打开时遇到错误用文本修复器打开文件 WPS打开时是乱码...
  16. 三个经典故事告诉你:什么叫契约精神
  17. 24位真彩色图片取摸方法(用于WS2812显示)
  18. 完全卸载Android Studio的方法
  19. storm apache java_Apache Storm 示例 Java 拓扑 - Azure HDInsight | Microsoft Docs
  20. 店铺logo设计免费在线生成

热门文章

  1. (转)IE的box模型显示bug
  2. python主要数据变量及其类型说明_Python的数据类型和变量
  3. python计算运动会某个参赛选手的得分。数据保存在文件中_Python基础教程之第二章---变量和字符串(1) 搬运...
  4. 《NO STRATEGY》《重塑战略》
  5. 设计模式-备忘录模式
  6. Building Fire Stations 39届亚洲赛牡丹江站B题
  7. 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
  8. 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )
  9. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
  10. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )