public E removeLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return unlinkLast(l); }
last為成員變量,為什麼不直接在方法裡使用,而是賦值給一個final的局部變數?
看了下程式碼
transient Node<E> last;
last 是 transient 的吧如果把他賦值給一個局部 final 變數就不需要每次使用 last 都 check value 了吧
部分原因是這樣做能確保線程安全。假設這個方法不用 l 變數而是直接引用 last 成員,那麼判斷就變成了 if(this.last == null)。如果透過判斷之後的瞬間,last 被賦值成了 null,那麼下一句 unlinkLast(this.last) 就會出現未知的結果。
if(this.last == null)
unlinkLast(this.last)
看了下程式碼
last 是 transient 的吧
如果把他賦值給一個局部 final 變數就
不需要每次使用 last 都 check value 了吧
部分原因是這樣做能確保線程安全。假設這個方法不用 l 變數而是直接引用 last 成員,那麼判斷就變成了
if(this.last == null)
。如果透過判斷之後的瞬間,last 被賦值成了 null,那麼下一句unlinkLast(this.last)
就會出現未知的結果。