classAtomicDemo{privateAtomicInteger mAtomicInteger =newAtomicInteger();//如果没有指定值,默认是1privatevoiddoAdd(){for(int i =0; i <5; i++){int value =mAtomicInteger.addAndGet(1);System.out.println(Thread.currentThread().getName()+"--->"+ value);}}publicstaticvoidmain(String[]args){AtomicDemo demo =newAtomicDemo();newThread(demo::doAdd,"线程1").start();newThread(demo::doAdd,"线程2").start();}}//输出结果线程1--->1线程1--->2线程1--->3线程2--->4线程1--->5线程2--->6线程1--->7线程2--->8线程2--->9线程2--->10
public class AtomicInteger extends Number implements java.io.Serializable {
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
private static final long VALUE;
private volatile int value;//注意该值用volatile修饰
public AtomicInteger(int initialValue) {
value = initialValue;
}
//以原子的方式将输入的值与ActomicInteger中的值进行相加,
//注意:返回相加前ActomicInteger中的值
public final int getAndAdd(int delta) {
return U.getAndAddInt(this, VALUE, delta);
}
//以原子的方式将输入的值与ActomicInteger中的值进行相加,
//注意:返回相加后的结果
public final int addAndGet(int delta) {
return U.getAndAddInt(this, VALUE, delta) + delta;
}
//以原子方式将当前ActomicInteger中的值加1,
//注意:返回相加前ActomicInteger中的值
public final int getAndIncrement() {
return U.getAndAddInt(this, VALUE, 1);
}
//以原子方式将当前ActomicInteger中的值加1,
//注意:返回相加后的结果
public final int incrementAndGet() {
return U.getAndAddInt(this, VALUE, 1) + 1;
}
//省略部分代码...
}
public final int getAndAdd(int delta) {
return U.getAndAddInt(this, VALUE, delta);
}
public final int getAndAddInt(Object o, long offset, int delta) {
return theInternalUnsafe.getAndAddInt(o, offset, delta);
}
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);//先获取内存中存储的值
} while (!weakCompareAndSetInt(o, offset, v, v + delta));//如果不是期望的结果值,就一直循环
return v;
}
//该函数返回值代表CAS操作是否成功
public final boolean weakCompareAndSetInt(Object o, long offset,
int expected,
int x) {
return compareAndSetInt(o, offset, expected, x);//执行CAS操作
}
class AtomicDemo {
private int[] value = new int[]{0, 1, 2};
private AtomicIntegerArray mAtomicIntegerArray = new AtomicIntegerArray(value);
private void doAdd() {
for (int i = 0; i < 5; i++) {
int value = mAtomicIntegerArray.addAndGet(0, 1);
System.out.println(Thread.currentThread().getName() + "--->" + value);
}
}
public static void main(String[] args) {
AtomicDemo demo = new AtomicDemo();
new Thread(demo::doAdd, "线程1").start();
new Thread(demo::doAdd, "线程2").start();
}
//程序输出结果如下:
线程1--->1
线程1--->2
线程1--->4
线程2--->3
线程1--->5
线程2--->6
线程1--->7
线程2--->8
线程2--->9
线程2--->10
}
class AtomicDemo {
Person mPerson = new Person("红红", 1);
private AtomicReference<Person> mAtomicReference = new AtomicReference<>(mPerson);
private class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
private void updatePersonInfo(String name, int age) throws Exception {
System.out.println(Thread.currentThread().getName() + "更新前--->" + mAtomicReference.get().name + "---->" + mAtomicReference.get().age);
mAtomicReference.getAndUpdate(person -> new Person(name, age));
}
public static void main(String[] args) {
AtomicDemo demo = new AtomicDemo();
new Thread(() -> demo.updatePersonInfo("蓝蓝", 2), "线程1").start();
Thread.sleep(1000);
System.out.println("暂停一秒--->" + demo.mAtomicReference.get().name + "---->" + demo.mAtomicReference.get().age);
System.out.println("更新后---->" + demo.mAtomicReference.get().name + "---->" + demo.mAtomicReference.get().age);
}
}
//输出结果
线程1更新前--->红红---->1
暂停一秒--->蓝蓝---->2
更新后---->蓝蓝---->2