Akka手冊(cè)譯(一)——Akka和Java內(nèi)存模型

使用Lightbend平臺(tái)的主要好處,包括Scala和Akka,它簡(jiǎn)化了編寫并發(fā)軟件的過程烦周。本文討論如何Lightbend平臺(tái),尤其是Akka,并發(fā)應(yīng)用程序共享內(nèi)存的方法。

Java內(nèi)存模型

在Java 5之前,Java內(nèi)存模型(JMM)有誤的定義睦授。由多個(gè)線程訪問共享內(nèi)存時(shí)可以得到各種奇怪的結(jié)果锈锤,如:

  • 線程看不到其它線程寫入的值:可見性問題;
  • 線程觀察其他線程的“不可能”行為肆氓,指令沒有按預(yù)期的順序執(zhí)行引起:指令重新排序的問題袍祖。
    Java 5的JSR 133解決了這些問題。JMM的一組規(guī)則是基于“發(fā)生前”的關(guān)系谢揪,這強(qiáng)制了當(dāng)一個(gè)內(nèi)存訪問發(fā)生在其它之前蕉陋,相反地,允許在出現(xiàn)故障時(shí)發(fā)生拨扶。兩個(gè)例子說明這些規(guī)則:
  • 監(jiān)視鎖規(guī)則:釋放一個(gè)鎖之前每一個(gè)后繼得到相同的鎖凳鬓。
  • 易失變量規(guī)則:寫易失性變量之前每一個(gè)后續(xù)的讀相同的易失性變量。
    盡管JMM看起來復(fù)雜患民,規(guī)范試圖找到一個(gè)易于使用和寫的能力之間的平衡性能缩举,可伸縮的并發(fā)數(shù)據(jù)結(jié)構(gòu)。

Actor和Java內(nèi)存模型

Akka中Actor的實(shí)現(xiàn),有兩種方法在共享內(nèi)存環(huán)境下執(zhí)行多線程行為:

  • 如果一個(gè)消息發(fā)送到一個(gè)Actor(如由另一個(gè)Actor)仅孩。在大多數(shù)情況下托猩,消息是不可變的,但是如果這個(gè)信息構(gòu)造不可變的對(duì)象是不正確的辽慕,沒有“發(fā)生前”的規(guī)則京腥,接收者可能部分初始化數(shù)據(jù)結(jié)構(gòu),甚至可能值是憑空捏造的(長(zhǎng)型/雙精度型)
  • 如果Actor在處理消息時(shí)改變內(nèi)部狀態(tài)溅蛉,并在片刻后訪問這個(gè)狀態(tài)在處理另一個(gè)消息時(shí)公浪。深刻認(rèn)識(shí)到Actor模型中并不保證,同樣的線程會(huì)對(duì)不同消息執(zhí)行相同的Actor温艇。
    為了避免Actor的可見性和重排序問題因悲,Akka保證了下例兩個(gè)“發(fā)生前”的規(guī)則:
  • Actor發(fā)送規(guī)則:一個(gè)Actor發(fā)送消息發(fā)生之前由通一個(gè)Actor接收消息。
  • Actor后續(xù)處理規(guī)則:在處理消息發(fā)生前由同一個(gè)Actor處理后續(xù)消息勺爱。

注意
通俗的講改變Actor的內(nèi)部字段在下一個(gè)消息的可見晃琳。Actor中的字段不能是易失或相價(jià)的。

兩個(gè)規(guī)則僅適用于同一個(gè)Actor實(shí)例琐鲁,對(duì)不同的Actor無效卫旱。

Futures和Java模型

完成Feature的“發(fā)生前”執(zhí)行調(diào)用的回調(diào)注冊(cè)。

我們建議不要封閉非final字段(在Java用final围段,在Scala中用val )如果你選擇封閉非final字段顾翼,它們必須被標(biāo)識(shí)為‘volatile’為了字段的當(dāng)前值是可見的回調(diào)。

如果封閉一個(gè)引用奈泪,需要確保實(shí)例是線程安全的适贸。我們強(qiáng)烈建議遠(yuǎn)離使用鎖定的對(duì)象,因?yàn)樗谧顗牡那闆r下涝桅,引入性能問題和死鎖拜姿。這樣的同步是危險(xiǎn)的。

Actor和共享可變狀態(tài)

由于Akka運(yùn)行在JVM上仍有一些規(guī)則要遵循冯遂。

  • 封閉Actor內(nèi)部狀態(tài)蕊肥,并向其它線程暴露它。
1. class MyActor extends Actor {
2. var state = ...
3. def receive = {
4.    case _ =>
5.      //Wrongs
6. 
7.    // Very bad, shared mutable state,
8.    // will break your application in weird ways
9.      Future { state = NewState }
10.      anotherActor ? message onSuccess { r => state = r }
11. 
12.    // Very bad, "sender" changes for every message,
13.    // shared mutable state bug
14.      Future { expensiveCalculation(sender()) }
15. 
16.      //Rights
17. 
18.    // Completely safe, "self" is OK to close over
19.    // and it's an ActorRef, which is thread-safe
20.      Future { expensiveCalculation() } onComplete { f => self ! f.value.get }
21. 
22.    // Completely safe, we close over a fixed value
23.    // and it's an ActorRef, which is thread-safe
24.      val currentSender = sender()
25.      Future { expensiveCalculation(currentSender) }
26. }
27.}
  • 消息應(yīng)該是不可變的,這是為了避免共享可變狀態(tài)的陷阱蛤肌。

上一篇
下一篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壁却,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子裸准,更是在濱河造成了極大的恐慌展东,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炒俱,死亡現(xiàn)場(chǎng)離奇詭異琅锻,居然都是意外死亡卦停,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門恼蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僵芹,你說我怎么就攤上這事处硬。” “怎么了拇派?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荷辕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我件豌,道長(zhǎng)疮方,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任茧彤,我火速辦了婚禮骡显,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曾掂。我一直安慰自己惫谤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布珠洗。 她就那樣靜靜地躺著溜歪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪许蓖。 梳的紋絲不亂的頭發(fā)上蝴猪,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天膊爪,我揣著相機(jī)與錄音,去河邊找鬼蚁飒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淮逻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爬早,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醉旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起车胡,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匈棘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主卫,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年完域,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吟税。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸟蟹,死狀恐怖乌妙,靈堂內(nèi)的尸體忽然破棺而出建钥,到底是詐尸還是另有隱情,我是刑警寧澤熊经,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站镐依,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏槐壳。R本人自食惡果不足惜然低,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一务唐、第九天 我趴在偏房一處隱蔽的房頂上張望雳攘。 院中可真熱鬧枫笛,春花似錦吨灭、人聲如沸刑巧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吠冤。三九已至,卻和暖如春咨演,著一層夾襖步出監(jiān)牢的瞬間闸昨,已是汗流浹背薄风。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工拍嵌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遭赂,地道東北人横辆。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狈蚤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脆侮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 并發(fā)系列的文章都是根據(jù)閱讀《Java 并發(fā)編程的藝術(shù)》這本書總結(jié)而來靖避,想更深入學(xué)習(xí)的同學(xué)可以自行購買此書進(jìn)行學(xué)習(xí)潭枣。...
    小之丶閱讀 1,046評(píng)論 1 7
  • 從三月份找實(shí)習(xí)到現(xiàn)在幻捏,面了一些公司,掛了不少篡九,但最終還是拿到小米、百度榛臼、阿里、京東讽坏、新浪、CVTE路呜、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,239評(píng)論 11 349
  • 有些時(shí)候心理明明愛著笙蒙,我又不敢說出來,就算說出來了告訴自己也不會(huì)實(shí)現(xiàn)捅位,這可能是我比較悲觀的想法,試了又試可是又不想...
    lirs閱讀 636評(píng)論 1 1
  • 景邁山——夏無酷暑艇搀,冬無嚴(yán)寒,四季如春求晶,雨量充沛焰雕,土壤肥沃,山花爛漫芳杏,果實(shí)累累矩屁,亞熱帶風(fēng)光旖旎。 山間云霧繚繞爵赵,山...
    芳華拾柒閱讀 201評(píng)論 7 3
  • ---相關(guān)和因果 在前面幾章里吝秕,心理學(xué)上證明個(gè)案的時(shí)候,往往用了很少有相關(guān)性的因素烁峭,得出因果關(guān)系,最后想證明某個(gè)結(jié)...
    會(huì)思慧想閱讀 338評(píng)論 0 1