既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?