您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

聊聊并发编程两原则,你明白了吗?

时间:2023-06-13 13:23:42  来源:  作者:码农世界

之前写过一篇文章, 并发编程的核心技术 – 多版本(Multi Versioning), 本文继续对并发编程做一次更全面的总结, 这样的总结并非具体的编程指导, 而概括性的理论, 是笔记性质的.

根据经验总结, 并发编程的指导思想可以总结为两个原则, 也即并发编程两原则:

  1. Sharding/Partitioning
  2. Leveling

Sharding

Sharding 技术常见于分布式系统, 如果我举一个编程技巧里常用的技术, 估计你会比较熟悉 - 哈希锁. 例如 JAVA 语言里的 ConcurrentHashMap, 内部就是把整个容器分成独立的多个分段, 每个分段对应一把锁. 或者某些 KV 数据库, 预先分配若干个锁到数组中, 然后把每一个 key 根据 hash 算法对应不同的锁上面, 当需要对 key 加锁时, 加的是对应的那把锁, 两个 key 概率上可以同时加锁(并发).

分布式系统的核心之一就是 Sharding, 我曾经说过"无 Sharding, 不分布式", 指出没有严谨 Sharding 机制的多副本系统是伪分布式, 即使是所谓的强一致性多副本系统, 如无 Sharding 便是"伪分布式". Sharding 也是计算机科学领域核心思想之一的分而治之思想.

所以, 如果你遇到因为锁粒度太大导致多个并发操作相互阻塞的问题, 最直接的解决方案就是分析细化和拆分资源(做 Sharding), 不同的资源对应不同的锁, 这样就解决了阻塞问题. 一些初学者非常害怕和排斥锁, 我觉得没有必要. 程序的本质是串行化, 是锁, 我们能做的无非是: 减小锁粒度.

Sharding 是一种竖直分拆, 分拆出来的每一个 Shard 都是完全独立的(shared-nothing). 这一点和接下来要提到的 Leveling 在空间上刚好垂直.

Leveling

Leveling 是一种水平分拆, 也叫 Layering(多层级). 在数据库领域, 它也叫 Multi Versioning(MVCC). 和 Photoshop 里作图类似, Leveling 包含多个 Level(层), 将不同的层级进行叠加(Merge), 最终形成一个统一的输出对象.

和 Photoshop 类似, 我们可以独立地操作每一个层, 如果需要加锁, 那就加在层上面, 因此, 也达到了减小锁粒度的效果. 看到了吧? 并发编程的唯一指导思想就是减小锁粒度. 妄图完全消除锁, 将在指导思想上发生根本错误.

Leveling 和 Sharding 技术的区别, 就在于它们如何对外展现. Leveling 需要将所有层进行合并, 才能输出结果. 而 Sharding 技术中的每一个 Shard, 可以独立地输出结果. 显然, 在这一点上 Sharding 技术要优于 Leveling. 既然 Sharding 更优, 为什么还需要 Leveling 呢? 因为, 事物并不总是可以做 Sharding, 有时候你做不了 Sharding.

单点标记

单点标记不是并发编程的核心原则, 而是 Leveling 技术的常见优化手段. 我们知道, Leveling 技术需要合并(Merge)操作, 合并操作可能成本较大, 这时, 我们需要把结果进行缓存. 但缓存和原始的层是同等地位的, 可能出现所谓的不一致(不相同)的问题, 所以, 需要引入一个单点标记, 对两者是否一致进行确认(check point, commit point), 就好像把两个子节点挂到了同一个父节点之下.

另外, 合并操作涉及很多算法, 某些算法不需要缓存, 仅仅是从多层(多个节点)之中选出一个 Winner, 以该 Winner 作为输出结果. 这时, 单点标记就是输出结果的指针, 指向 Winner.

总结

总结出简洁的基础理论, 对我们的工作有什么帮助呢? 我认为, 一是可以帮助我们记忆, 二是掌握了基础理论之后, 可以随时推导出已有的大量纷纭复杂的技术, 不至于被乱花迷了眼.

另外, 并发编程和分布式系统本质上如此相似, 后面我将写一些文章, 用同样的基础理论对分布式系统进行分析.



Tags:编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
“不懂编程就是文盲”?别用焦虑论调裹挟家长
据3月17日中新网报道,随着科技的发展和社会的进步,科创教育逐渐走入千家万户,少儿编程作为代表,近年来更是备受瞩目。然而,“未来的文盲,就是不懂编程的人”的论调也甚嚣尘上。必...【详细内容】
2024-03-19  Search: 编程  点击:(9)  评论:(0)  加入收藏
编程二十年,38岁谷歌程序员的16条建议,涉创业、技术淘汰、拿大厂offer……
以能够让项目自负盈亏,并在这一约束下优化其增长的方式来管理和调整项目,这是这个世上最厉害的本事。距离我正式开始编程的工作已经过去二十年了。在这些年里,我有以下收获: 获...【详细内容】
2024-03-10  Search: 编程  点击:(4)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  Search: 编程  点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03  Search: 编程  点击:(69)  评论:(0)  加入收藏
主流编程语言哪个更容易学?
主流编程语言哪个更容易学?在当今数字化时代,编程语言已成为一项重要的技能,越来越多的人开始学习编程。然而,对于初学者来说,选择一门容易入门的编程语言是至关重要的。在本文中...【详细内容】
2024-01-31  Search: 编程  点击:(136)  评论:(0)  加入收藏
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31  Search: 编程  点击:(131)  评论:(0)  加入收藏
不容错过的4款宝藏GPTs:程序员新宠,让编程不再枯燥!
原文来源:硬 AI自从GPT Store“开业”以来,我们就一直在使用不同的GPTs,尝试自动化一些重复繁琐的日常工作。在浩如烟海的GPTs中,虽然真正有用的并不多,很多GPTs的功能都比较局限...【详细内容】
2024-01-24  Search: 编程  点击:(46)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  Search: 编程  点击:(106)  评论:(0)  加入收藏
在 Rust 编程中使用泛型
本文的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。1.摘要Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以...【详细内容】
2024-01-09  Search: 编程  点击:(89)  评论:(0)  加入收藏
Go编程中调用外部命令的几种场景
在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库...【详细内容】
2024-01-09  Search: 编程  点击:(107)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条