重排,可见性,锁
如下几种情况引发指令重排:
不改变单线程执行语义情况下编译器优化重排
对无数据依赖的指令,处理器可进行指令重排(并行执行)
写缓存,无效队列导致的内存数据一致性问题(写缓存只对自己可见)
指令重排举例:
早上起来喝茶程序:,两个角色:老板,秘书
秘书动作序列:准备茶叶,烧水-水烧开会发出蜂鸣声
老板动作序列:听到蜂鸣声,泡茶喝.
秘书实际执行:先烧水,烧水同时准备茶叶.
老板泡茶可能出现场景:
水烧开了.发现秘书的茶还没准备好.
水烧开了.秘书的茶已准备好.
解决办法:
秘书先准备好茶才能烧水.
引起问题:效率降低.