mesi协议会对线程间的共享变量设置标记,如果当前线程缓存行内的共享变量被其他线程修改,当前缓存行内的共享变量会被设置为无效(Invalidate),那么再次用到这个变量时会从主内存中读取最新值。既然是这样,为什么我在编写java程序时,不使用 volatile关键字仍然会有线程间的可见性问题?
例如:一个线程进行死循环,循环内对共享变量flag进行判断若为true则跳出循环(初始为false),另一个线程在线程1进行循环后将flag设置为true,此时最开始的线程仍读flag为false一直死循环
疑问:不是已经由cpu的缓存一致性协议保证了可见性的问题了吗?为什么此时一个线程仍然读不到另一个线程修改共享变量后的最新值呢?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…