Atomic类的作用是什么?

  • Post category:Java

Atomic类是Java SE 5之后新增的一种多线程并发处理工具,主要用于解决多线程并发访问共享变量时的线程安全问题。它会确保所有的操作都是原子性的,也就是要么全部被执行,要么全都不执行,从而保证多个线程并发操作时的数据安全。

使用Atomic类主要包括以下步骤:

  1. 导入java.util.concurrent.atomic包中的相关类

在使用Atomic类时,需要在代码开头导入java.util.concurrent.atomic包中需要使用的类,例如:

import java.util.concurrent.atomic.AtomicInteger;
  1. 创建需要被原子性操作的变量

接下来,需要创建需要被原子性操作的变量,例如:

AtomicInteger atomicInteger = new AtomicInteger(0);

上述代码中,创建了一个初始值为0的原子性整型变量。

  1. 使用原子性操作

在需要进行原子性操作的地方可以直接使用Atomic类中提供的一些操作方法。例如,在上述变量的基础上执行原子性加操作:

atomicInteger.addAndGet(1);

上述代码中,使用addAndGet()方法将原子性整型变量增加1.

  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,然后退出循环;否则将重新获取最新的值和期望的值,再次尝试修改值。