Java 多线程三大核心

原子性Java 的原子性就和数据库事物的原子性差不多,一个操作中要么全部执行成功或者失败。JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。 自增。 再赋值给 i。这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronize 或者是 lock 进行加锁处理。如果是基础类的自增操作可以使用 Ato...
摘要由CSDN通过智能技术生成

原子性

Java 的原子性就和数据库事物的原子性差不多,一个操作中要么全部执行成功或者失败。

JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:

  • 获取 i 的值。
  • 自增。
  • 再赋值给 i。

这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronize 或者是 lock 进行加锁处理。

如果是基础类的自增操作可以使用 AtomicInteger 这样的原子类来实现(其本质是利用了 CPU 级别的 的 CAS 指令来完成的)。

其中用的最多的方法就是: incrementAndGet() 以原子的方式自增。 源码如下:

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

首先是获得当前的值,然后自增 +1。接着则是最核心的 compareAndSet() 来进行原子更新。

public final boolean compareAndSet(long expect, long update) {
        return unsafe.compareAndSwapLong(this,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值