CAS (compare and swap ) 操作是最基本的原子操作之一,现在几乎所有的cpu都支持CAS操作。
int compare_and_swap( Mem m,int oldval, newval){
int old_reg_val = m;
if(old_reg_val==oldval){
m= newval;
return old_reg_val;
}
}
其中,Mem代表一种变量的类型,oldval是该变量的初始值,newval为更新后的值。在compare_and_swap()方法的执行过程中,首次取出内存单元的值,然后和oldval值进行比较
,如果相同,才将内存位置的值设置为新值,否则,仍然为旧值。
基本类型的原子类:
基本类型的原子类包括:AtomicInteger、AtomicBoolean、AtomicLong等.
public class AtomicInter extends Number implements Serializable 继承 Number 实现 Serializable接口
在程序中需要原子的增加或减少计数器时,使用此类 AtomicInteger
方法:
1)public AtomicInteger();//初始化该类。初始值为0
2)public AtomicInteger( int initialValue) //给定初始值的初始化
Demo示例:
public class Counter{
private AtomicInteger ia = new AtomicInteger();
public void increase(){
ia.getAndIncrement();
}
public int get(){
return ia.get();
}
}
public class Worker extends Thread{
Counter counter;
public Worker( Counter counter){
this.counter = counter;
}
public void run (){
for(int i=0;i<100;i++){
counter.increase();
}
}
}
public class Index{
public static void main(String[] args){
Counter counter = new Counter(0;
Thread t1 = new Worker(counter);
Thread t2 = new Worker(counter);
t1.start();
t2.start();
try{
t1.jion();
t2.jion();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("counter.get() = " + counter.get());
}
}
-----------------------------------------------------------------------------------------------------------------------------
一般引用类型的原子类:AtomicReference
public class AtomicReference <V> extends Object implements Serializable
用V来指明应用的类型
1)public AtomicReference() // 用初始值null创建类AmoticReference的实例。
2)public AtomicReference( V initialValue) // 用初始initialValue 创建类AtomicReference的实例,其中,initialValue的类型由参数V指定。
Demo示例:
public class Counter(){
private AtomicReference<Integer> af = new AtomicReference<Integer>(0);
public void increase(){
Integer temp = af.get();
af.comparseAndSet( temp,temp+1);
}
public Integet get(){
return af.get();
}
}
public class Worker extends Thread{
Counter counter;
public Worker( Counter counter){
this.counter = counter;
}
public void run (){
for(int i=0;i<100;i++){
counter.increase();
}
}
}
public class Index{
public static void main(String[] args){
Counter counter = new Counter(0;
Thread t1 = new Worker(counter);
Thread t2 = new Worker(counter);
t1.start();
t2.start();
try{
t1.jion();
t2.jion();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("counter.get() = " + counter.get());
}
}