JAVA CAS 原子类及多线程总结

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.原子类操作是没有先后顺序

使用场景

秒杀时候商品数量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值