目录
原子性数组
Java提供以原子性操作整型和长整型数值的数组AtomicIntegerArray,AtomicLongArray。Java中普通数组形式的AtomicInteger[]并发线程安全的对象。
一、主程序
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);
// ******** 以下是普通数组形式的 执行会发生异常。
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++;
}
}
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
Exception in thread "Thread-200" Exception in thread "Thread-201" Exception in thread "Thread-202" Exception in thread "Thread-203" Exception in thread "Thread-204" Exception in thread "Thread-206" Exception in thread "Thread-205" Exception in thread "Thread-207" Exception in thread "Thread-208" Exception in thread "Thread-211" Exception in thread "Thread-212" Exception in thread "Thread-209" Exception in thread "Thread-214" Exception in thread "Thread-213" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-229" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-230" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-253" Exception in thread "Thread-255" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-252" Exception in thread "Thread-257" Exception in thread "Thread-254" Exception in thread "Thread-250" Exception in thread "Thread-251" Exception in thread "Thread-249" Exception in thread "Thread-245" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-265" Exception in thread "Thread-246" Exception in thread "Thread-247" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-248" Exception in thread "Thread-241" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-244" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-243" Exception in thread "Thread-238" Exception in thread "Thread-242" Exception in thread "Thread-240" java.lang.NullPointerException
at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-225" Exception in thread "Thread-239" Exception in thread "Thread-237" java.lang.NullPointerException
ERROR2 :0