目录
原子性数组
Java提供以原子性操作整型和长整型数值的数组AtomicIntegerArray,AtomicLongArray。
一、主程序
package xyz.jangle.thread.test.n7_9.atomicarray;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* 7.9、原子性数组
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月17日 上午10:24:17
*
*/
public class M {
public static void main(String[] args) {
final int THREADS = 100;
AtomicIntegerArray vector = new AtomicIntegerArray(1000);
AtomicInteger[] vector2 = new AtomicInteger[1000];
var incrementer = new Incrementer(vector);
var decrementer = new Decrementer(vector);
var incrementer2 = new Incrementer2(vector2);
var decrementer2 = new Decrementer2(vector2);
var incrementers = new Thread[THREADS];
var decrementers = new Thread[THREADS];
var incrementers2 = new Thread[THREADS];
var decrementers2 = new Thread[THREADS];
for (int i = 0; i < THREADS; i++) {
incrementers[i] = new Thread(incrementer);
decrementers[i] = new Thread(decrementer);
incrementers[i].start();
decrementers[i].start();
}
// 同步
for (int i = 0; i < THREADS; i++) {
try {
incrementers[i].join();
decrementers[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int errors = 0;
for (int i = 0; i < vector.length(); i++) {
if (vector.get(i) != 0) {
System.out.println("Vector[" + i + "] :" + vector.get(i));
errors++;
}
}
System.out.println("ERROR :" + errors);
// ******** 以下是普通数组形式的 。
// add SSS 2025年9月13日08:35:01
for(int i =0;i<vector2.length;i++) {
vector2[i] = new AtomicInteger(0);
}
// add EEE
for (int i = 0; i < THREADS; i++) {
incrementers2[i] = new Thread(incrementer2);
decrementers2[i] = new Thread(decrementer2);
incrementers2[i].start();
decrementers2[i].start();
}
// 同步
for (int i = 0; i < THREADS; i++) {
try {
incrementers2[i].join();
decrementers2[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
errors = 0;
for (int i = 0; i < vector2.length; i++) {
// if (vector.get(i) != 0) {
// System.out.println("Vector[" + i + "] :" + vector.get(i));
// errors++;
// }
// modified 2025年9月13日08:36:31
if(vector2[i].get()!=0) {
System.out.println("Vector[" + i + "] :" + vector2[i].get());
errors++;
}
}
System.out.println("ERROR2 :" + errors);
}
}
二、自增线程
package xyz.jangle.thread.test.n7_9.atomicarray;
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* 自增线程
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月17日 下午7:00:11
*
*/
public class Incrementer implements Runnable {
private final AtomicIntegerArray vector;
public Incrementer(AtomicIntegerArray vector) {
super();
this.vector = vector;
}
@Override
public void run() {
for (int i = 0; i < vector.length(); i++) {
vector.getAndIncrement(i);
}
}
}
三、自降线程
package xyz.jangle.thread.test.n7_9.atomicarray;
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* 自降线程
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月17日 下午7:03:15
*
*/
public class Decrementer implements Runnable {
private AtomicIntegerArray vector;
public Decrementer(AtomicIntegerArray vector) {
super();
this.vector = vector;
}
@Override
public void run() {
for (int i = 0; i < vector.length(); i++) {
vector.getAndDecrement(i);
}
}
}
四、普通数组形式的自增线程
package xyz.jangle.thread.test.n7_9.atomicarray;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 自增线程2 数组形式的Atomic
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月17日 下午7:00:11
*
*/
public class Incrementer2 implements Runnable {
private final AtomicInteger[] vector;
public Incrementer2(AtomicInteger[] vector) {
super();
this.vector = vector;
}
@Override
public void run() {
for (int i = 0; i < vector.length; i++) {
vector[i].getAndIncrement();
}
}
}
五、普通数组形式的自降线程
package xyz.jangle.thread.test.n7_9.atomicarray;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 自增线程2 数组形式的Atomic
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月17日 下午7:00:11
*
*/
public class Incrementer2 implements Runnable {
private final AtomicInteger[] vector;
public Incrementer2(AtomicInteger[] vector) {
super();
this.vector = vector;
}
@Override
public void run() {
for (int i = 0; i < vector.length; i++) {
vector[i].getAndIncrement();
}
}
}
六、执行结果
ERROR :0
ERROR2 :0

本文通过对比测试AtomicIntegerArray与普通AtomicInteger数组的形式,演示了Java中原子性数组在多线程环境下的稳定性和非原子性数组可能引发的问题。
519

被折叠的 条评论
为什么被折叠?



