### 17.1 P2 — `rotate` 가 비교 후 교체가 아니라 덮어쓰기다 `install` 은 정확하다. ```java if (!holder.compareAndSet(null, runtime)) { throw new IllegalStateException("… already has a runtime; use rotate()"); } ``` `rotate` 는 그렇지 않다. ```java GrpcChannelRuntime previous = holder.get(); if (!previous.generation().supersededBy(next)) { throw …; }