Atomic类是Java提供的线程安全的、并发编程中常用的一种原子性操作的基础类。在Java中,对于一些基本数据类型,例如int、long、boolean等,线程之间的并发读、写操作是非常常见的,而这些基本类型的操作在Java的多线程环境下需要保证原子性,即要么是全部执行成功,要么全部执行失败,简单地说就是不能因为线程切换而导致数据不一致。如果在并发执行多个线程的情况下对普通的基本类型进行操作,将会引起线程安全问题。
Java提供了原子性操作类,可以保证基本数据类型的原子性操作,这就是Atomic类。Atomic类从Java SE5.0中开始提供,它是线程安全的,可以保证操作是原子性的,当多个线程同时对同一个数据进行操作时,Atomic类可以保证最终结果的正确性。
以下是Atomic类的使用攻略及示例说明:
使用AtomicInteger类
AtomicInteger类是Atomic类中最常用的一个,它可以保证整数类型的原子性操作。以下是示例代码:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
public static void main(String[] args) {
AtomicInteger count = new AtomicInteger(0);
System.out.println(count.get()); // 输出 0
count.incrementAndGet();
System.out.println(count.get()); // 输出 1
count.addAndGet(5);
System.out.println(count.get()); // 输出 6
int expect = 6;
int update = 8;
boolean result = count.compareAndSet(expect, update);
System.out.println(result); // 输出 false,因为 count 的值为 6,与 expect 不相等
result = count.compareAndSet(6, 8);
System.out.println(result); // 输出 true,因为此时 count 的值为 6,与 expect 相等,更新为 8
}
}
上述代码中,首先创建一个AtomicInteger对象count,初始值为0。然后使用incrementAndGet()方法对其进行+1操作,addAndGet(5)方法进行+5操作,get()方法获取当前值。最后使用compareAndSet()方法对其进行更新操作,若count的值与期望值expect相等,则更新为新值update,否则更新失败。
使用AtomicReference类
除了原子性操作基本数据类型,还可以使用AtomicReference类进行线程安全的操作任意对象。以下是示例代码:
import java.util.concurrent.atomic.AtomicReference;
public class AtomicExample {
private static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) {
Person p1 = new Person("Tom", 18);
AtomicReference<Person> atomicPerson = new AtomicReference<>(p1);
System.out.println(atomicPerson.get()); // 输出 Person{name='Tom', age=18}
Person p2 = new Person("Jack", 20);
atomicPerson.compareAndSet(p1, p2);
System.out.println(atomicPerson.get()); // 输出 Person{name='Jack', age=20}
}
}
上述代码中,首先创建一个Person对象p1,并将其赋值给AtomicReference对象atomicPerson。然后再创建一个Person对象p2,使用compareAndSet()方法将atomicPerson的值从p1更新为p2。最终通过get()方法获取atomicPerson的值。该示例中,因为使用了AtomicReference类的compareAndSet()方法,所以该操作是线程安全的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是Atomic类? - Python技术站