Atomic

Atomic 是一个 Java 并发库中的包,位于 java.util.concurrent.atomic 包下。这个包提供了一系列原子类,这些类用于实现不可变对象和基本操作的原子性。这些原子类包括 AtomicIntegerAtomicLongAtomicReferenceAtomicStampedReference 等,它们都继自 AtomicReference 类。

这些原子类的主要特点和用途如下:

  1. 原子操作:这些原子类提供了一系列原子操作,如增加(incrementAndGet())、减少(decrementAndGet())、加法(addAndGet())、比较并交换(compareAndSet())等。这些操作都是原子的,即它们在执行过程中不会被其他线程中断。

  2. 高效性:与使用同步块(synchronized)或重入锁(ReentrantLock)相比,原子类通常更高效,因为它们避免了线程上下文的切换和同步开销。

  3. 线程安全:由于其原子操作,原子类可以安全地在多线程环境中使用,而不需要显式的同步代码。

  4. 内存可见性:原子类的操作会自动处理内存可见性问题,确保其他线程能够看到最新的更新值。

以下是 Atomic 包中的一些常用原子类及其用途:

  • AtomicInteger:用于对整型变量进行原子操作。
  • AtomicLong:用于对长整型变量进行原子操作。
  • AtomicReference:用于对对象引用进行原子操作,即可以原子地更新一个对象的引用。
  • AtomicStampedReference:用于对带有版本号的引用进行原子操作,即可以原子地更新引用和版本号。

这些原子类在多线程环境中非常有用,可以简化代码,提高性能,并减少并发问题。

以下是 AtomicLong 的一些常用方法:

  • get():返回当前值。
  • set(long newValue):设置当前值为 newValue
  • incrementAndGet():将当前值加一,并返回新的值。
  • decrementAndGet():将当前值减一,并返回新的值。
  • addAndGet(long delta):将当前值增加 delta,并返回新的值。
  • compareAndSet(long expect, long update):如果当前值等于 expect,则将当前值设置为 update,并返回 true;否则返回 false

一个简单的计时机制,这个机制可以在多线程环境中安全地记录和更新暂停时间。

import java.util.concurrent.atomic.AtomicLong;
import android.os.SystemClock;

public class TimerExample {

    // 使用AtomicLong来确保线程安全
    private final AtomicLong mPauseTime = new AtomicLong();

    // 方法来开始计时
    public void startTiming() {
        // 记录当前时间
        mPauseTime.set(SystemClock.elapsedRealtime());
    }

    // 方法来停止计时
    public void stopTiming() {
        // 将暂停时间设置为特殊值,表示停止计时
        mPauseTime.set(Long.MIN_VALUE);
    }

    // 方法来获取已暂停的时间(毫秒)
    public long getPausedTime() {
        // 如果计时未停止,则计算已暂停的时间
        if (mPauseTime.get() != Long.MIN_VALUE) {
            return SystemClock.elapsedRealtime() - mPauseTime.get();
        }
        // 如果计时已停止,则返回0
        return 0;
    }

    // 示例使用
    public void exampleUsage() {
        // 开始计时
        startTiming();

        // ... 在这里执行一些操作 ...

        // 假设在某个时间点我们想要获取已暂停的时间
        long pausedTime = getPausedTime();
        System.out.println("Paused time: " + pausedTime + " ms");

        // 假设在另一个时间点我们想要停止计时
        stopTiming();
    }
}

在这个例子中:

  • startTiming() 方法使用 SystemClock.elapsedRealtime() 来记录当前时间,并将其存储在 mPauseTime 中。
  • stopTiming() 方法将 mPauseTime 设置为 Long.MIN_VALUE,这表示计时已被停止。
  • getPausedTime() 方法计算自计时开始以来经过的时间。如果 mPauseTime 是 Long.MIN_VALUE,则表示计时已停止,因此返回0。

使用 AtomicLong 确保了在多线程环境中更新 mPauseTime 的线程安全性。如果多个线程可能会调用 startTiming()stopTiming() 或 getPausedTime() 方法,AtomicLong 将确保这些操作不会互相干扰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值