The main issue of CPU cache is that it is expected to be both shared and mutable. This requires a complex protocol for invalidation between threads.
If different model is assumed, it would allow for much faster and simpler caches. e.g., in Erlang all mutable memory is thread-local and all shared memory is immutable. With this model, invalidation is only required when thread is moved to another CPU unit, and that’s all.