/**
* 无锁优化 自旋
* CAS是CPU的原语支持。。。
* 无锁优化就是没有加锁 通过值的比较实现线程安全。
* cas(V, ExceptValue, NewValue)
* 首先有一个内存空间这个内存空间用来存放实际的值。
* 整体流程就是相当于有一个篮子,篮子就相当于一块内存空间 然后篮子里面有一定数量的苹果
* 我去往里面放苹果,我期望篮子里面有多少个苹果 放的时候比较以及篮子里面实际的苹果数量是不是我期望的
* 如果是 则将我的数量给他 否则不更新数据 重新拿到一个新的期望值再比较一番。。
*
* ABA问题: 因为这里有个比较的过程,拿自己的期望值去比较,在我比较的过程中有一个线程去改了数据,同时又有另外一个线程将数据改了回来。
* 1->2->1 需要加上一个版本号就可以解决了,比较值的时候同时比较版本,如果是基础类型无所谓
*
* 之前保证线程安全都是使用加锁, 现在不需要加锁,底层还是使用了unsafe这个类
* 这个类可以直接操作jvm中的内存。。 jdk1.8到jdk11 中的方法有些改动。。
LongAdder 底层采用分段锁的方式。。
*/
public class AutomicTest {
private AtomicInteger atomicInteger = new AtomicInteger(0);
void m() {
for (int i = 0; i < 1000; i++) {
atomicInteger.incrementAndGet();
}
}
public static void main(String[] args) {
AutomicTest automicTest = new AutomicTest();
List<Thread> threads = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
threads.add(new Thread(automicTest::m, "t"+i));
}
threads.forEach(a-> a.start());
threads.forEach(a-> {
try {
a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(automicTest.atomicInteger.get());
}
}