1.原子类操作是cpu底层指令执行,本身为原子性,由于一个线程的操作会经历挂起到重新激活步骤而原子类操作没有锁耳屎通过CAS(compare and set)的不停循环实现的,因此相比添加锁的 方式使用原子类性能更高
基本原子类实现都依赖于unsafe和volation
volatile与synchronized区别在于,volatile性能消耗比synchronized少很多,但是volatile并不能造成线程的阻塞,所以在使用时候如果volatile修饰的值本身参与计算那么久不能 使用volatile(如计数器),volatile优点就在于一个线程修改值以后,由于是直接操作内存中的值而不是寄存器中的值,所以对其他线程是立马可见状态
例子
static int j=0;
public static void main(String args[]){
Thread[] th=new Thread[100];
for(int i=0;i<th.length;i++){
th[i]=new Thread(){
@Override
public void run() {
for(int i = 0;i < 10000;i++){
j++;
}
}
};
th[i].start();
}
for (Thread thread : th) {
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 输出结果理论上是1000000,而实际结果总是小于该值
* 造成的原因是:执行顺序不确定性以及中断的不可预知性产生的数据不一致
*/
System.out.println(j);
}
如果将int改为java.util.concurrent.atomic包中的AtomicInteger则输出值就为1000000
2.原子类操作是没有先后顺序
使用场景
秒杀时候商品数量