AtomicIntegerArray更新数组元素问题
vZou 2018-05-06 02:59:42 package com.zzb.thread.test.atomic;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicIntegerArray;
public class TestAtomicIntegerArray {
public static void main(String[] args) {
new TestAtomicIntegerArray().start1();
new TestAtomicIntegerArray().start2();
}
private void start1() {
final int[] arr = new int[10];
new CountArrayElement(arr).start();
new CountArrayElement(arr).start();
new CountArrayElement(arr).start();
if(Thread.activeCount() > 0) {
Thread.yield();
}
System.out.println(Arrays.toString(arr) + " finished1");
}
class CountArrayElement extends Thread {
private int[] arr;
public CountArrayElement(final int[] arr) {
this.arr = arr;
}
public void run() {
final int length = arr.length;
for(int i = 0; i < length; i++) {
for(int j = 1; j <= 100; j++) {
//arr[i] += j;
arr[i]++;
}
}
}
}
private void start2() {
final AtomicIntegerArray aiarr = new AtomicIntegerArray(10);
new CountAtomicArrayElement(aiarr).start();
new CountAtomicArrayElement(aiarr).start();
new CountAtomicArrayElement(aiarr).start();
if(Thread.activeCount() > 0) {
Thread.yield();
}
System.out.println(aiarr + " finished2");
}
class CountAtomicArrayElement extends Thread {
private AtomicIntegerArray aiarr;
public CountAtomicArrayElement(final AtomicIntegerArray aiarr) {
this.aiarr = aiarr;
}
public void run() {
final int length = aiarr.length();
for(int i = 0; i < length; i++) {
for(int j = 1; j <= 100; j++) {
aiarr.incrementAndGet(i);
}
}
}
}
}
//这段代码中,AtomicIntegerArray很少得到300,说明是非线程安全的,我有什么地方不正确吗?