多线程面试--进阶篇1(原子操作)

1.CAS(Compare And Swap)

i++,是一个原子操作吗?答案:不是;
Compare And Swap就是比较并且交换的一个原子操作
CAS包含三个参数:
1、变量所在内存地址C;
2、变量应该的值A;
3、我们将要修改的值B。
原理过程:
如果说C上的变量的值是A的话,就用B重新赋值,如果不是A,那就什么事也不做,操作的返回结果原值是多少。
循环CAS:
在一个死循环【for( ; ; )】里不断进行CAS操作,直到成功为止(又叫自旋操作)。

2.CAS实现原子操作的都有哪些问题

共三大问题
第一个问题,ABA问题
其他的线程把值改成了C,很快改成了A。解决ABA,
我们可以通过引入版本号来解决
第二问题,
如果循环时间很长的话,cpu的负荷就会比较大
第三个问题
如果对一个变量进行操作还好,但是同时操作多个共享变量的话会有点麻烦

3.CAS线程安全

CAS线程安全是通过硬件层面的阻塞实现原子操作的安全

4.原子更新基本类型类有哪些

1.AtomicBoolean(Atomic:原子的 /ə’tɑmɪk/ )
2.AtomicInteger
3.AtomicLong
4.AtomicReference。

AtomicInteger的常用方法如下
1.int addAndGet(int delta):
2.boolean compareAndSet(int expect,int update):
3.int getAndIncrement(): (原子递增,但是返回的是自增以前的值)
4.incrementAndGet: (原子递增,但是返回的是自增以后的值)
5.int getAndSet(int newValue):

5.原子更新数组类

1.AtomicIntegerArray
2.AtomicLongArray
3.AtomicReferenceArray

AtomicIntegerArray类常用方法如下
·int addAndGet(int i,int delta):
·boolean compareAndSet(int i,int expect,int update):
(数组是通过构造方法传入的,类会将数组复制一份,所以原数组不会发生变化)。

6.原子更新引用类型提供的类

1.AtomicReference: 可以解决更新多个变量的问题
2.AtomicStampedReference:解决ABA问题
3.AtomicMarkableReference:解决ABA问题

7.原子更新字段类

Atomic包提供了以下3个类进行原子字段更新。
1.AtomicReferenceFieldUpdater:
2.AtomicIntegerFieldUpdater:
3.AtomicLongFieldUpdater:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值