Atomic
是一个 Java 并发库中的包,位于 java.util.concurrent.atomic
包下。这个包提供了一系列原子类,这些类用于实现不可变对象和基本操作的原子性。这些原子类包括 AtomicInteger
、AtomicLong
、AtomicReference
、AtomicStampedReference
等,它们都继自 AtomicReference
类。
这些原子类的主要特点和用途如下:
-
原子操作:这些原子类提供了一系列原子操作,如增加(
incrementAndGet()
)、减少(decrementAndGet()
)、加法(addAndGet()
)、比较并交换(compareAndSet()
)等。这些操作都是原子的,即它们在执行过程中不会被其他线程中断。 -
高效性:与使用同步块(
synchronized
)或重入锁(ReentrantLock
)相比,原子类通常更高效,因为它们避免了线程上下文的切换和同步开销。 -
线程安全:由于其原子操作,原子类可以安全地在多线程环境中使用,而不需要显式的同步代码。
-
内存可见性:原子类的操作会自动处理内存可见性问题,确保其他线程能够看到最新的更新值。
以下是 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
将确保这些操作不会互相干扰。