1、直接操作內存,使用Unsafe 這個類
2、使用 getIntVolatile(var1, var2) 獲取線程間共享的變量
3、采用CAS的嘗試機制(核心所在),代碼如下:
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
可以看到這個do .... while {!this.compareAndSwapInt(var1, var2, var5, var5 + var4)} 。不斷地使用CAS進行重試,直到執行成功為止。這里是一個樂觀鎖的操作。
4、使用Atomic ,是在硬件上、寄存器進行阻塞,而不是在線程、代碼上阻塞。
5、這個是通俗說法ABA的問題