该Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
java.util.concurrent.atomic包定义了支持单个变量上原子操作的类。所有的类都有类似于volatile变量的读取和写入的get和set方法。也就是说,set与后续对同一变量的get有一个happens-before的关系。原子compareAndSet方法和适用于整数原子变量的简单原子算术方法也具有这些内存一致性特征。
为了看到这个包的使用方法,让我们回到最初用来演示线程干扰的Counter类:
class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
使Counter在多线程干扰下安全的一种方法是将其方法设置为同步的,就像SynchronizedCounter中的方法一样:
class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
对于这个简单的类,同步是一种可接受的解决方案。但是对于一个更复杂的类,我们可能希望避免不必要的同步带来的活性影响。用AtomicInteger替换int字段使我们能够在不使用同步的情况下防止线程干扰,就像AtomicCounter中的方法一样:
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
}