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讀操做,不能進行重排序。

這樣能確保指令不會被重排序,從而避免可能出現的空指針問題 指針

相關文章
相關標籤/搜索