AtomicIntegerArray更新数组元素问题

时间:2023-01-17 14:55:01
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,说明是非线程安全的,我有什么地方不正确吗?

2 个解决方案

#1


写算法 期望结果和实际结果

#2


我已解决,问题出在Thread.activeCount()检查同组线程数上,应该是1而不是0,可通过join来实现。上面没有得出数组元素值为300,是因为打印的是线程的瞬时态

#1


写算法 期望结果和实际结果

#2


我已解决,问题出在Thread.activeCount()检查同组线程数上,应该是1而不是0,可通过join来实现。上面没有得出数组元素值为300,是因为打印的是线程的瞬时态