簡體   English   中英

Clojure STM歧義因素

[英]Clojure STM ambiguity factor

在Clojure中,我們使用STM進行並發。

我的問題是STM使用數據的時間點值,是不是這引入了歧義?

我們怎么知道訪問了什么價值?

Clojure中的STM提供(通過refdosync )一個事務上下文,其中所有更新都保證“同時”發生在從外部世界查看時涉及的所有引用。

目標是保持系統中價值的一致性,典型的例子是兩個銀行賬戶之間的資金轉移。 如果您從賬戶A轉賬到賬戶B的100美元,那么您將希望同時更改A和B的金額。

在此示例中,對於在事務內處理的金額讀取的值實際上沒有歧義,因為在完成事務外部的讀取時,只有以下情況是可能的:

  1. 交易已經開始但尚未完成,因此價值尚未“正式”改變。 事務可以在以后提交或重試,但是當您閱讀它們時,這就是每個帳戶的狀態。
  2. 交易已完成,因此讀取的金額為修改后的值。

在事務內部時,只讀(並且不修改)的ref 可以將它們的值從事務的一個點更改為另一個,這稱為寫偏斜 (參見Clojure Programming - 第4章,參考, 寫偏斜 ) 。 為了避免這種情況,您可以使用ensure (而不是deref ),這將導致如果任何這些ref的值發生更改(您只讀取的那些),那么將重試整個事務。

在這種情況下,Clojurians使用“時間”和“價值”這兩個詞來表達非常具體的含義,以消除這種歧義。 在這種情況下,“時間”是“序列中的時間”或划時代的時間,而不是牆上的時間。 因此, 時間描述了此標識的值序列中的哪個值

價值是在某個時間點身份的不變內容。 該值可以是簡單的(原始值或原子值)或復合值,並由任意結構化的不變值組成。 重要的是, 值不會改變,所以如果你想知道使用了哪個值,你可以簡單地打印或記錄它

我高度推薦這部關於價值觀,國家和身份的視頻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM