久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

java - 如何理解“不要通過共享內(nèi)存來通信,而應該通過通信來共享內(nèi)存”?

瀏覽:132日期:2024-01-05 15:34:18

問題描述

不要通過共享內(nèi)存來通信,而應該通過通信來共享內(nèi)存

這是一句風靡golang社區(qū)的經(jīng)典語,對于剛接觸并發(fā)編程的人,該如何理解這句話?

問題解答

回答1:

https://blog.golang.org/share...

這篇文章里面說的比較清楚了,使用共享內(nèi)存的話在多線程的場景下為了處理競態(tài),需要加鎖,使用起來比較麻煩。另外使用過多的鎖,容易使得程序的代碼邏輯堅澀難懂,并且容易使程序死鎖,死鎖了以后排查問題相當困難,特別是很多鎖同時存在的時候。

go語言的channel保證同一個時間只有一個goroutine能夠訪問里面的數(shù)據(jù),為開發(fā)者提供了一種優(yōu)雅簡單的工具,所以go原生的做法就是使用channle來通信,而不是使用共享內(nèi)存來通信。

回答2:

我認為前者的意思是大家都維護一個狀態(tài),后者是每個人都維護一份狀態(tài)副本。

回答3:

共享內(nèi)存會涉及到多個線程同時訪問修改數(shù)據(jù)的情況,那得保證數(shù)據(jù)的安全性,可見性,那就會加鎖,加鎖會讓并行變?yōu)榇校琧pu也忙于線程搶鎖。不如換一種方式,把數(shù)據(jù)復制一份,每個線程有自己的,只要一個線程干完一件事其他線程不用去搶鎖了,這就是一種通信方式,把共享的以通知方式交給線程,實現(xiàn)并發(fā)

回答4:

其實如果從分布式的角度來理解,就會比較明了了。

打比方,ab兩個進程共同對同一個消息隊列進行操作,那么,如果使用共享內(nèi)存的話,是不是這兩個進程就必須局限在同一個物理機上,那么通信的意義就大大縮小了。

如果在設計的時候,對于消息隊列,只提供讀寫接口,而對于內(nèi)部的實現(xiàn)你完全不用去在意,看起來消息隊列就像是共享內(nèi)存一樣了。然而你的消息隊列可以利用socket進行通信。

所以,上述這句話,不要用共享內(nèi)存實現(xiàn)通信是指不要讓程序一開始就局限在單機上,而是利用通信,也就是封裝內(nèi)部實現(xiàn),提供接口的方式來進行相應的操作

標簽: java
主站蜘蛛池模板: 奉节县| 黄浦区| 临安市| 高青县| 合肥市| 阿拉善盟| 甘孜县| 石屏县| 隆林| 大邑县| 洛扎县| 建平县| 平乡县| 米林县| 赤壁市| 台前县| 淮阳县| 吐鲁番市| 岚皋县| 普兰店市| 孝昌县| 定州市| 凌海市| 浠水县| 民乐县| 宿迁市| 大埔县| 亚东县| 普安县| 锡林郭勒盟| 哈密市| 明溪县| 贵港市| 白河县| 武宣县| 丹阳市| 龙岩市| 瑞丽市| 三穗县| 三门县| 永和县|