Atomic类是Java SE 5之后新增的一种多线程并发处理工具,主要用于解决多线程并发访问共享变量时的线程安全问题。它会确保所有的操作都是原子性的,也就是要么全部被执行,要么全都不执行,从而保证多个线程并发操作时的数据安全。
使用Atomic类主要包括以下步骤:
- 导入java.util.concurrent.atomic包中的相关类
在使用Atomic类时,需要在代码开头导入java.util.concurrent.atomic包中需要使用的类,例如:
import java.util.concurrent.atomic.AtomicInteger;
- 创建需要被原子性操作的变量
接下来,需要创建需要被原子性操作的变量,例如:
AtomicInteger atomicInteger = new AtomicInteger(0);
上述代码中,创建了一个初始值为0的原子性整型变量。
- 使用原子性操作
在需要进行原子性操作的地方可以直接使用Atomic类中提供的一些操作方法。例如,在上述变量的基础上执行原子性加操作:
atomicInteger.addAndGet(1);
上述代码中,使用addAndGet()方法将原子性整型变量增加1.
- 其他常用方法
在实际使用中,常用的原子性操作方法还有incrementAndGet(),decrementAndGet()等,分别用于自增和自减操作。同时,也可以通过compareAndSet()方法判断当前值是否和期望值相等,如果相等就修改为指定值。
下面是两个使用Atomic类的示例说明:
示例1:使用AtomicInteger实现线程安全的计数器
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public int getCount() {
return count.get();
}
public void increment() {
count.incrementAndGet();
}
public void decrement() {
count.decrementAndGet();
}
}
上述代码中,使用AtomicInteger实现了一个线程安全的计数器。在increment()和decrement()方法中,通过调用原子性加1(incrementAndGet())和减1(decrementAndGet())的方式实现对计数器的自增和自减操作。
示例2:通过compareAndSet()方法实现乐观锁机制
import java.util.concurrent.atomic.AtomicInteger;
public class OptimisticLock {
private AtomicInteger value = new AtomicInteger(0);
// 模拟其他线程修改value的操作
public void otherThreadModify() {
value.incrementAndGet();
}
// 通过compareAndSet()方法实现乐观锁机制
public void optimisticLock() {
int expect = value.get();
int newValue = expect * 2;
while (!value.compareAndSet(expect, newValue)) {
expect = value.get();
newValue = expect * 2;
}
}
}
上述代码中,使用AtomicInteger模拟一个值被其他线程修改的场景。在optimisticLock()方法中,通过compareAndSet()方法尝试将变量的值乘以2,而在这个过程中可能存在其他线程同时修改变量的情况,因此需要使用乐观锁机制保证数据安全。如果操作成功,方法将返回true,然后退出循环;否则将重新获取最新的值和期望的值,再次尝试修改值。