偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊并發(fā)編程兩原則,你明白了嗎?

開(kāi)發(fā) 前端
合并操作涉及很多算法, 某些算法不需要緩存, 僅僅是從多層(多個(gè)節(jié)點(diǎn))之中選出一個(gè) Winner, 以該 Winner 作為輸出結(jié)果. 這時(shí), 單點(diǎn)標(biāo)記就是輸出結(jié)果的指針, 指向 Winner。

之前寫過(guò)一篇文章, 并發(fā)編程的核心技術(shù) – 多版本(Multi Versioning), 本文繼續(xù)對(duì)并發(fā)編程做一次更全面的總結(jié), 這樣的總結(jié)并非具體的編程指導(dǎo), 而概括性的理論, 是筆記性質(zhì)的.

根據(jù)經(jīng)驗(yàn)總結(jié), 并發(fā)編程的指導(dǎo)思想可以總結(jié)為兩個(gè)原則, 也即并發(fā)編程兩原則:

  1. Sharding/Partitioning
  2. Leveling

Sharding

Sharding 技術(shù)常見(jiàn)于分布式系統(tǒng), 如果我舉一個(gè)編程技巧里常用的技術(shù), 估計(jì)你會(huì)比較熟悉 - 哈希鎖. 例如 Java 語(yǔ)言里的 ConcurrentHashMap, 內(nèi)部就是把整個(gè)容器分成獨(dú)立的多個(gè)分段, 每個(gè)分段對(duì)應(yīng)一把鎖. 或者某些 KV 數(shù)據(jù)庫(kù), 預(yù)先分配若干個(gè)鎖到數(shù)組中, 然后把每一個(gè) key 根據(jù) hash 算法對(duì)應(yīng)不同的鎖上面, 當(dāng)需要對(duì) key 加鎖時(shí), 加的是對(duì)應(yīng)的那把鎖, 兩個(gè) key 概率上可以同時(shí)加鎖(并發(fā)).

分布式系統(tǒng)的核心之一就是 Sharding, 我曾經(jīng)說(shuō)過(guò)"無(wú) Sharding, 不分布式", 指出沒(méi)有嚴(yán)謹(jǐn) Sharding 機(jī)制的多副本系統(tǒng)是偽分布式, 即使是所謂的強(qiáng)一致性多副本系統(tǒng), 如無(wú) Sharding 便是"偽分布式". Sharding 也是計(jì)算機(jī)科學(xué)領(lǐng)域核心思想之一的分而治之思想.

所以, 如果你遇到因?yàn)殒i粒度太大導(dǎo)致多個(gè)并發(fā)操作相互阻塞的問(wèn)題, 最直接的解決方案就是分析細(xì)化和拆分資源(做 Sharding), 不同的資源對(duì)應(yīng)不同的鎖, 這樣就解決了阻塞問(wèn)題. 一些初學(xué)者非常害怕和排斥鎖, 我覺(jué)得沒(méi)有必要. 程序的本質(zhì)是串行化, 是鎖, 我們能做的無(wú)非是: 減小鎖粒度.

Sharding 是一種豎直分拆, 分拆出來(lái)的每一個(gè) Shard 都是完全獨(dú)立的(shared-nothing). 這一點(diǎn)和接下來(lái)要提到的 Leveling 在空間上剛好垂直.

Leveling

Leveling 是一種水平分拆, 也叫 Layering(多層級(jí)). 在數(shù)據(jù)庫(kù)領(lǐng)域, 它也叫 Multi Versioning(MVCC). 和 Photoshop 里作圖類似, Leveling 包含多個(gè) Level(層), 將不同的層級(jí)進(jìn)行疊加(Merge), 最終形成一個(gè)統(tǒng)一的輸出對(duì)象.

和 Photoshop 類似, 我們可以獨(dú)立地操作每一個(gè)層, 如果需要加鎖, 那就加在層上面, 因此, 也達(dá)到了減小鎖粒度的效果. 看到了吧? 并發(fā)編程的唯一指導(dǎo)思想就是減小鎖粒度. 妄圖完全消除鎖, 將在指導(dǎo)思想上發(fā)生根本錯(cuò)誤.

Leveling 和 Sharding 技術(shù)的區(qū)別, 就在于它們?nèi)绾螌?duì)外展現(xiàn). Leveling 需要將所有層進(jìn)行合并, 才能輸出結(jié)果. 而 Sharding 技術(shù)中的每一個(gè) Shard, 可以獨(dú)立地輸出結(jié)果. 顯然, 在這一點(diǎn)上 Sharding 技術(shù)要優(yōu)于 Leveling. 既然 Sharding 更優(yōu), 為什么還需要 Leveling 呢? 因?yàn)? 事物并不總是可以做 Sharding, 有時(shí)候你做不了 Sharding.

單點(diǎn)標(biāo)記

單點(diǎn)標(biāo)記不是并發(fā)編程的核心原則, 而是 Leveling 技術(shù)的常見(jiàn)優(yōu)化手段. 我們知道, Leveling 技術(shù)需要合并(Merge)操作, 合并操作可能成本較大, 這時(shí), 我們需要把結(jié)果進(jìn)行緩存. 但緩存和原始的層是同等地位的, 可能出現(xiàn)所謂的不一致(不相同)的問(wèn)題, 所以, 需要引入一個(gè)單點(diǎn)標(biāo)記, 對(duì)兩者是否一致進(jìn)行確認(rèn)(check point, commit point), 就好像把兩個(gè)子節(jié)點(diǎn)掛到了同一個(gè)父節(jié)點(diǎn)之下.

另外, 合并操作涉及很多算法, 某些算法不需要緩存, 僅僅是從多層(多個(gè)節(jié)點(diǎn))之中選出一個(gè) Winner, 以該 Winner 作為輸出結(jié)果. 這時(shí), 單點(diǎn)標(biāo)記就是輸出結(jié)果的指針, 指向 Winner.

總結(jié)

總結(jié)出簡(jiǎn)潔的基礎(chǔ)理論, 對(duì)我們的工作有什么幫助呢? 我認(rèn)為, 一是可以幫助我們記憶, 二是掌握了基礎(chǔ)理論之后, 可以隨時(shí)推導(dǎo)出已有的大量紛紜復(fù)雜的技術(shù), 不至于被亂花迷了眼.

另外, 并發(fā)編程和分布式系統(tǒng)本質(zhì)上如此相似, 后面我將寫一些文章, 用同樣的基礎(chǔ)理論對(duì)分布式系統(tǒng)進(jìn)行分析.

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2022-10-19 08:19:32

動(dòng)態(tài)基線預(yù)警

2022-10-24 20:25:40

云原生SpringJava

2024-03-05 10:09:16

restfulHTTPAPI

2022-05-31 07:32:19

JDK8API工具

2021-09-16 21:34:52

5G專線

2024-05-30 08:19:52

微服務(wù)架構(gòu)大型應(yīng)用

2023-04-04 08:42:30

IT成本技術(shù)堆

2023-01-29 08:08:34

并發(fā)庫(kù)conc通用庫(kù)

2022-03-03 09:20:08

分布式數(shù)據(jù)庫(kù)場(chǎng)景

2022-07-27 08:31:28

SQL開(kāi)發(fā)控制

2024-11-08 08:56:01

2023-07-03 09:59:00

并發(fā)編程并發(fā)容器

2021-11-30 06:56:59

緩存穿透數(shù)據(jù)庫(kù)

2022-12-30 08:35:00

2024-08-09 13:39:27

2023-06-26 08:02:34

JSR重排序volatile

2023-12-28 08:43:28

前端算法搜索

2024-01-08 20:05:32

2022-04-07 11:15:22

PulseEventAPI函數(shù)

2022-10-10 18:38:56

inert屬性鍵盤
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)