原子变量与CAS算法

此花不与群花比

原子性问题

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

一些常见的代码,如i++并不是原子操作,多线程并发执行时极易出现错误

1
2
3
4
5
6
7
public static void main(String[] args) {
// TODO Auto-generated method stub
AtomicDemo ad=new AtomicDemo();
for(int i=0;i<20;i++){
new Thread(ad).start();
}
}
1
2
3
4
5
6
7
8
9
10
11
public class AtomicDemo implements Runnable{
private int serialNumber=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(getSerialNumber());
}
public int getSerialNumber(){
return serialNumber++;
}
}

jdk1.5后java.util.concurrent.atomic包提供了许多包装器用于原子的整数浮点数等

  1. 它们内部使用了volatile保证内存可见性,
  2. CAS(Compare-And-Set)算法保证数据操作的原子性,CAS算法是硬件对于并发操作共享数据的支持

CAS算法包含了三个操作数: 内存值 V;预估值 A;更新值 B;当且仅当V == A时,V=B,否则什么也不做

1
2
3
4
5
6
7
8
9
10
11
public class AtomicDemo implements Runnable{
private AtomicInteger serialNumber=new AtomicInteger();
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(getSerialNumber());
}
public int getSerialNumber(){
return serialNumber.getAndIncrement();//等价于i++
}
}
Donate comment here