Concurrency Concepts
Isolated State
Concurrent programs keep mutable state behind a small boundary.
Update through one boundary
isolated_state.swift
Replay: real traced execution (multi-file project)
struct CounterState {
var value = 0
mutating func add(_ amount: Int) {
value += amount
}
}
let amount = 3
var state = CounterState()
state.add(amount)
let message = "counter=\(state.value)"
print(message)
struct CounterState {
var value = 0
mutating func add(_ amount: Int) {
value += amount
}
}
let amount = 1
var state = CounterState()
state.add(amount)
let message = "counter=\(state.value)"
print(message)
struct CounterState {
var value = 0
mutating func add(_ amount: Int) {
value += amount
}
}
let amount = 6
var state = CounterState()
state.add(amount)
let message = "counter=\(state.value)"
print(message)
amount ← 3, state ← CounterState(value: 0)
9let amount→ 3 = 3 //@amount=1, 610var state→ CounterState(value: 0) = CounterState()11stateCounterState(value: 0).add(amount3)12let message = "counter=\(state.value)"value ← 3
4mutating func add(_ amount3: Int) {5 value→ 3 += amount36}state ← CounterState(value: 3), message ← counter=3
10var state = CounterState()11state→ CounterState(value: 3).add(amount3)12let message→ counter=3 = "counter=\(state.value3)"1314print(messagecounter=3)outputcounter=3
amount ← 1, state ← CounterState(value: 0)
9let amount→ 1 = 110var state→ CounterState(value: 0) = CounterState()11stateCounterState(value: 0).add(amount1)12let message = "counter=\(state.value)"value ← 1
4mutating func add(_ amount1: Int) {5 value→ 1 += amount16}state ← CounterState(value: 1), message ← counter=1
10var state = CounterState()11state→ CounterState(value: 1).add(amount1)12let message→ counter=1 = "counter=\(state.value1)"1314print(messagecounter=1)outputcounter=1
amount ← 6, state ← CounterState(value: 0)
9let amount→ 6 = 610var state→ CounterState(value: 0) = CounterState()11stateCounterState(value: 0).add(amount6)12let message = "counter=\(state.value)"value ← 6
4mutating func add(_ amount6: Int) {5 value→ 6 += amount66}state ← CounterState(value: 6), message ← counter=6
10var state = CounterState()11state→ CounterState(value: 6).add(amount6)12let message→ counter=6 = "counter=\(state.value6)"1314print(messagecounter=6)outputcounter=6
isolated state
This small type models the same idea actors enforce: callers update state through a method instead of changing storage from many places.