"command 여럿, 메모리 하나, 어쩌면 동시에. 락이 걔네가 서로 밟지 않게 막아주는 거야."
왜 그냥 못 바꾸나
managed state는 공유 참조를 쥐여주고, Rust는 공유 참조를 통한 변경을 금지해 — command 둘이 동시에 돌아서 데이터를 망칠 수 있으니까. 변경을 안전하게 허락하는 방법이 interior mutability야: 바뀌는 데이터를 Mutex<T>로 감싸. 바꾸려면 mutex를 lock()하는데, 락 가드가 떨어질 때까지 독점 접근을 줘. 락을 시도하는 다른 command는 차례를 기다려. 찢어진 쓰기 없음, 레이스 없음 — 강제돼.
락, 변경, 해제 — 빠르게
락은 가능한 한 짧게 들어. 락 걸고, 변경하고, 가드를 떨궈(보통 스코프 끝나면) 끝. 너무 오래 든 락은 앱 전체를 그 mutex 하나에 직렬화해. 쓰기보다 읽기가 훨씬 많은 state엔 RwLock이 여러 reader를 동시에 들이고 쓰기일 때만 막아 — 캐시랑 가끔 갱신되는 설정에 더 맞아.
async 함정 (또)
bridge 트랙의 Send 규칙 기억해: std::sync::Mutex 가드를 .await를 가로질러 들면 안 돼 — async command에서 컴파일 안 되고, 된다 쳐도 deadlock 위험이야. await 전에 가드를 떨구거나(락, 필요한 거 복사, 언락, 그다음 await) tokio::sync::Mutex 같은 async 인식 mutex를 써. 대부분 command엔 락-복사-언락 패턴이 제일 단순하고 빨라.