原子操作类AtomicInteger

目录

为什么需要原子操作类

如果使用volatile修饰变量呢

使用AtomicInteger

CAS指令

incrementAndGet()方法

JUC包原子类的类型及方法


为什么需要原子操作类

原子操作,是指一个操作是不可分割,不可中断的;

在java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下操作就是线程不安全的;(n++解析为n=n+1,明显这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题)

如果使用volatile修饰变量呢

volatile特性

  • 可见性,保证被修饰的变量在线程间可见,对变量的所有写操作都能立即反应到其他线程中;即volatile修饰的变量在各个线程中是一致的;

只是保证了可见性,在并发情况下并不能保证线程安全(n++不具备原子性)

使用AtomicInteger

incrementAndGet()方法具备原子性

同步,多线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程或一些使用;

阻塞同步和非阻塞同步都是实现线程安全的两个保障手段;非阻塞同步主要解决了阻塞同步中线程阻塞和唤醒带来的性能问题;

非阻塞同步:在并发环境下,某个线程对共享变量先进行操作;如果没有其他线程争用共享数据那操作就成功;如果存在数据争用冲突,就采取补偿措施,比如重试机制,直到成功为止;因为这中乐观的并发策略不需要把线程挂起,也就把这种同步操作称为非阻塞同步;

CAS指令

CAS(compare-and-swap),比较并交换

CAS指令需要3个操作数

  • 内存值V,变量的内存地址
  • 旧的预期值A
  • 新值B

CAS指令执行时,当且仅当V符合旧预期值A时,处理器用新值B更新V的值,否则就不执行更新操作;但无论是否更新了V的值,都会返回V的旧值;这个处理过程是一个原子操作;

在JDK1.5后,java程序才可以使用CAS操作,该操作由Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供,编译出的结果就是一条平台相关的处理器CAS指令;

incrementAndGet()方法

public final int incrementAndGet() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return next;
        }
}

方法在一个无限循环体内,不断尝试将一个比当前值大1的新值赋值给自己;如果失败,说明在执行“获取-设置”操作时已经被其他线程修改过了,于是便再次进入循环执行下一次操作,直到成功为止;

JUC包原子类的类型及方法

https://blog.csdn.net/J080624/article/details/84838991

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值