volatile happen before 原则

guava RateLimiter java

private volatile Object mutexDoNotUseDirectly;

  private Object mutex() {
    Object mutex = mutexDoNotUseDirectly;
    if (mutex == null) {
      synchronized (this) {
        mutex = mutexDoNotUseDirectly;
        if (mutex == null) {
          mutexDoNotUseDirectly = mutex = new Object();
        }
      }
    }
    return mutex;
  }

结合volatile 内存语义this

  • 当第二个操做为volatile写操做时,无论第一个操做是什么(普通读写或者volatile读写),都不能进行重排序。这个规则确保volatile写以前的全部操做都不会被重排序到volatile写以后;
  • 当第一个操做为volatile读操做时,无论第二个操做是什么,都不能进行重排序。这个规则确保volatile读以后的全部操做都不会被重排序到volatile读以前;
  • 当第一个操做是volatile写操做时,第二个操做是volatile读操做,不能进行重排序。

这样能确保指令不会被重排序,从而避免可能出现的空指针问题 指针

相关文章
相关标签/搜索