单独写原则Single Writer Principle
对于一个高并发的实时系统,低延迟-高吞吐是设计首要考虑的问题,对称多处理器为程序并发提供了硬件平台,当在多线程处理环境中,对一些公共资源的读写难免要互斥,谁获得锁,是随机的,其他的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相关推荐
- 软件设计原则(二)单一职责原则 -Single Responsibility Principle
SRP,Single Responsibility Principle: There should never be more than one reason for a class to chang ...
- 单一职责原则(Single Responsibility Principle)
在软件设计.编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码.SOLID是五个基本原则的首字母.这五个原则如下: Single responsibility Open–c ...
- 设计模式原则篇:(1)单一职责原则--Single Responsibility Principle
上篇文章提及到设计模式中应遵循的设计原则,并且列出了设计模式中应当遵循的六大原则. 次篇文章主要讨论单一职责原则. 单一职责原则(SRP): 不要存在多于一个导致类变更的原因.简单的讲,就是一个类或接 ...
- 单一指责原则(Single Responsibility Principle) SRP
using System; using System.Collections.Generic; using System.Text;namespace SingleResponsibilityPrin ...
- 围观设计模式(1)--单一职责原则(SRP,Single Responsibility Principle)
沉寂了一个月的时间,仔细学习了下设计模式,从本篇博文开始陆续更新设计模式系列的文章,我给它起了个有意思的名字叫做:"围观"设计模式,当然围观是加引号的,我写博文分享的目的一方面是将 ...
- Single Responsibility Principle (SRP) - OO设计的单一职责原则
前言 Robert C. Martin氏为我们总结了在面向对象的设计(OOD)中应该遵循的原则,这些原则被称为"Principles of OOD",关于"Princip ...
- 设计模式-设计原则(Design Principle)
本文由@呆代待殆原创,转载请注明出处. 写在前面:所谓设计原则并不是一定要遵守的法则,只是一种建议,因为保持这些原则本身会有一定代价,若是这些代价超过了带来的好处就得不偿失了,所以一切还是以简单为准. ...
- 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...
- 开闭原则(Open-Closed Principle,OCP)
2 开闭原则(Open-Closed Principle,OCP) 2.1 什么是开闭原则 开闭原则是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一, ...
最新文章
- 9.Matlab中的repmat,clock,rand以及seed,state,twister参数
- [Usaco2009 Feb]Revamping Trails 道路升级
- XP系统和Sever2003系统现实定时开关机
- 写论文时的一些高大上词句
- 微服务治理实践:服务契约
- VS静态库和动态库的区别
- FreeEIM 在盛大的开幕仪式结束之后
- qpython能使用json吗l_[python] 详解Python在使用JSON时需要注意的编码问题
- 从零开始学习前端JAVASCRIPT — 7、JavaScript基础EVENT
- 浙大 PAT b1040
- bootstrap模态框和select2合用时input无法获取焦点
- 第二季-专题11-世界一下变大了-MMU
- 计算机网络暗地里范围,《计算机网络应用技术教程》期中试题.doc
- 【C++】虚表指针和虚函数表
- word打开wps文件乱码_word文件打不开,打开时遇到错误用文本修复器打开文件 WPS打开时是乱码...
- 三个经典故事告诉你:什么叫契约精神
- 24位真彩色图片取摸方法(用于WS2812显示)
- 完全卸载Android Studio的方法
- storm apache java_Apache Storm 示例 Java 拓扑 - Azure HDInsight | Microsoft Docs
- 店铺logo设计免费在线生成
热门文章
- (转)IE的box模型显示bug
- python主要数据变量及其类型说明_Python的数据类型和变量
- python计算运动会某个参赛选手的得分。数据保存在文件中_Python基础教程之第二章---变量和字符串(1) 搬运...
- 《NO STRATEGY》《重塑战略》
- 设计模式-备忘录模式
- Building Fire Stations 39届亚洲赛牡丹江站B题
- 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
- 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
- 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )