1、手动实现CAS 思想之自增原理:
public class HalfAtomicInt {
private static AtomicInteger atomicI = new AtomicInteger(0);
/*CAS递增方法实现*/
public void increament() {
for (;;) {//死循环操作,直到成功为止
int i = getCount();//获取当前的值
boolean suc = compareAndSet(i, ++i);//比较并交换方法
if (suc) {
break;
}
}
}
public int getCount() {
return atomicI.get();
}
public boolean compareAndSet(int oldValue,int newValue){
return atomicI.compareAndSet(oldValue,newValue);
}
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
HalfAtomicInt halfAtomicInt = new HalfAtomicInt();
for(int i=0;i<10;i++){//循环十次,开十个线程
new Thread(new Runnable() {
@Override
public void run() {//每个线程循环1000次
for(int i=0;i<1000;i++){
halfAtomicInt.increament();
atomicI.incrementAndGet();//CAS自有的自增操作,只能一次加一。
}
}
}).start();
}
Thread.sleep(20);
System.out.println("调用incrementAndGet方法自增后:"+atomicI.get()+";耗时:"+(System.currentTimeMillis()-startTime));
System.out.println("调用iincreament方法自增后:"+halfAtomicInt.getCount()+";耗时:"+(System.currentTimeMillis()-startTime));
}
}
执行结果:
此实例demo在项目中经常用到,只需换一种业务方式,是自增还是其他规律赋值。其主要API有:
public final int get() //获取当前的值
public final int getAndSet(int newValue)//获取当前的值,并设置新的值
public final int getAndIncrement()//获取当前的值,并自增
public final int getAndDecrement() //获取当前的值,并自减
public final int getAndAdd(int delta) //获取当前的值,并加上预期的值
public final int incrementAndGet() //获取自增后的值
public final int decrementAndGet()//获取自减后的值
大家可以多测试使用一下,
2、当然也可以用synchronized 内置锁实现:
private static int i=0;
//此方式效率比较低
public synchronized static int countSum(){
i++;
return i;
}
分享到处结束,下篇我们分析AQS原理及使用,敬请期待!