Replace usage of dispatch_semaphore with OSSpinLock.
Since we don't need reentrancy for this implementation, and the lock is likely to be contended for small amounts of time, a spin lock should give us better performance.
The cache property can be readonly.