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,说明是非线程安全的,我有什么地方不正确吗?
...全文
429 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
vZou 2018-05-07
  • 打赏
  • 举报
回复
我已解决,问题出在Thread.activeCount()检查同组线程数上,应该是1而不是0,可通过join来实现。上面没有得出数组元素值为300,是因为打印的是线程的瞬时态
tianfang 2018-05-07
  • 打赏
  • 举报
回复
写算法 期望结果和实际结果

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧