【CAP】JAVA之AtomicReference非鎖同步

并發最簡單的競態問題是操作一個基本變量,如一個整數。

復雜問題是同時操作多個變量,要保證變量的結果一致,比如A加1那B就要減1。

簡單問題和復雜問題都可以通過鎖來實現。

用鎖劃出臨界區(一段代碼),這段代碼通過鎖保證不能被并行執行。

代碼就是對競態數據的邏輯操作,并且只能通過這段代碼操作競態數據。

CAS提供了另一種解決競態問題的方案。

AtomicReference解決競態問題

比如A加1那B就要減1的問題,可以把A和B做成一個對象。

1
AtomicReference<AB> data = new AtomicReference<AB>();

每個線程復制一份data,操作完后通過compareAndSet設置到公共變量。

可以參考AtomicInteger加1的操作:

1
2
3
4
5
6
7
8
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

可以封裝個AtomicAB類來完成這件事,復制data到ThreadLocal中,修改完后再寫加公共data對象。

体彩25选5走势图