使用原子進行非協同、同步的更新

使用原子進行非協同、同步的更新

相比引用,原子是一種更加輕量級的機制。

在事務中對多個引用進行更新會被協同,而原子則允許更新單個的值,不與其他的任何事物協同。可以使用atom來建立原子,它的函式簽名與ref非常類似。

使用原子進行非協同、同步的更新

使用原子進行非協同、同步的更新

對原子解引用就可以得到它的值,這和引用是一樣的。

使用原子進行非協同、同步的更新

原子並不參與事務,因而不需要dosync。要為一個原子設定值,簡單的呼叫reset!即可。

使用原子進行非協同、同步的更新

使用原子進行非協同、同步的更新

如果打算使用原子對current-track和current-composer兩者進行協同更新,應該怎麼做呢?簡短的回答是:“不能。”這就是引用和原子之間的區別。如果需要協同訪問,那麼還是使用引用吧。

把歌曲的標題和作曲家都放進一個對映表,並把這整個對映表儲存到一個原子中

使用原子進行非協同、同步的更新

使用原子進行非協同、同步的更新

使用原子進行非協同、同步的更新

swap!透過在an-atom當前的值上呼叫函式f來更新an-atom,此外還可以傳入額外的一些引數args。

使用原子進行非協同、同步的更新

swap!返回了新的值。如果其他執行緒也試圖修改同一個原子的話,有可能會導致swap!被再次呼叫。因此,傳給swap!的函式應該是沒有副作用的。引用和原子執行的都是同步更新。當更新函式返回時,值就已經改變了。

如果不需要這樣的控制級別,並且能夠容忍一段時間之後才進行非同步更新,那麼 agent代理就是你想要的。