将AtomicInteger转换为int

时间:2013-11-27 17:59:41

标签: java multithreading synchronization

我写了一个线程,为了内存同步,我必须使用Atomicinteger。这是我的代码:

public class NewClass implements Runnable {

public double rr;
public double rmse_new;
public double rmse_newT;
private int k;
private int[][] Xdisc;

public NewClass(int Xdisc[][], double[][] pat_cand, int k, double[][] Yresid, double[][] Xresid) {

    this.k = k;
    this.Xdisc = Xdisc;
}

@Override
public void run() {
    final AtomicInteger q = new AtomicInteger(0);
    q.set(0);
    while (true) {
        if (q.incrementAndGet() >= Xdisc.length) {
            break;

            Integer[] temp_X;
            temp_X = new Integer[Xdisc[0].length];
            for (int s = 0; s < Xdisc[0].length; s++) {
                temp_X[s] = Xdisc[q][s];
            }
        }
    }
}
}

问题是q是2D数组Xdisc的行索引(在主类中)并且显然应该是整数但在NewClass中,q是AtomicInteger。因此我收到了这个错误:

incompatible types
required: int
found: AtomicInteger

在这一行

temp_X[s] = Xdisc[q][s];

我甚至尝试过

temp_X[s] = Xdisc[(int)q][s];

并收到此错误:

inconvertible types

无论如何将AtomicInteger转换为int?

3 个答案:

答案 0 :(得分:4)

如果您尝试在整个循环中使用相同的值,只需使用incrementAndGet()的返回值:

int index = q.incrementAndGet();
if (index >= Xdisc.length) {
    break;
} // I'm assuming you meant there to be a brace here...

Integer[] temp_X;
temp_X = new Integer[Xdisc[0].length];
for (int s = 0; s < Xdisc[0].length; s++) {
    temp_X[s] = Xdisc[index][s];
}

如果您想要绝对最新值,请使用get()

答案 1 :(得分:0)

Atomic-classes的目的是允许通过compareAndSet()方法或incrementAndGet()之类的子方法对这些值进行线程安全使用,但是您没有在线程中使用AtomicInteger上下文,所以用标准的int替换它不会有任何区别(除了运行得更快)。

原因是你在Runnable中创建了AtomicInteger,所以基本上每个线程都有它的非常自己的实例。

一般来说,您应该阅读Java类的优秀文档,它将回答许多问题:AtomicInteger

答案 2 :(得分:0)

请使用:

AtomicInteger x = new AtomicInteger();
int result = x.intValue();