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,是因为打印的是线程的瞬时态