package org.aidan;
import java.util.concurrent.CountDownLatch;
/**
* @author aidan
*/
public class MyAtomicInteger implements java.io.Serializable {
private static final long serialVersionUID = -7932402631919933044L;
private volatile int value;
public MyAtomicInteger(int value) {
this.value = value;
}
public int getValue() {
return value;
}
/**
* 相当于 原版中的 compareAndSet 方法
*
* @param expect
* @param update
* @return
*/
public boolean cas(int expect, int update) {
return UnsafeUtil.casInt(this, "value", expect, update);
}
public int incrementAndGet() {
boolean casSuccess = false;
for (; !casSuccess; ) {
int value = getValue();
casSuccess = cas(value, value + 1);
}
return getValue();
}
public static void main(String[] args) {
final MyAtomicInteger myAtomicInteger = new MyAtomicInteger(0);
int threadCount = 100;
final CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
myAtomicInteger.incrementAndGet();
latch.countDown();
}).start();
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(myAtomicInteger.getValue());
}
}
启动100个线程,每个线程都让MyAtomicInteger自增,最后输出:
100