0

私は、すべての呼び出しでsizeofとその前のを合計する必要があるプロジェクトに取り組み始めました。beAttributessize

以下は私のコードです-

public static void main(String[] args) {

    final int noOfThreads = 2;

    //create thread pool with given size 
    ExecutorService service = Executors.newFixedThreadPool(noOfThreads);


    for (int i = 0, i< noOfThreads; i++) {
        service.submit(new ThreadTask());
    }

    // wait for termination        
    service.shutdown();
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

    System.out.println(ThreadTask.count_size);
}

class ThreadTask implements Runnable {

    public static int count_size = 0;

    @Override
    public void run() {

        while(time < 10 minutes) {
            try {

            ...

            List<BEAttribute<?>> beAttributes = beClient.getBEAttributes(columnsList);

            // Now I need to sum the beAttributes.size in every call

                final int size = beAttributes.size;
                count_size = count_size + size;
            ...

            } catch (InterruptedException e) {

            }
        }
    }

問題文:-

while ループで、メソッドの最初の呼び出しで、asgetBEAttributesを取得したとします。次に、それを静的整数に格納する必要があります。そして今、メソッドへの他の呼び出しで、私はasを得たので、これを前のに追加する必要があります。これで、その静的整数は 60 になります。そして、プログラムが終了するまでこのプロセスを続けます。メインスレッドから同じ静的整数を出力します。beAttributes.size2020 numbergetBEAttributesbeAttributes.size404020

私が現在行っている方法は、スレッドセーフかどうか? インクリメントのやり方に問題があると思います。はいの場合、誰かが正しいアプローチで私を助けることができますか?

4

2 に答える 2

0

同じ変数にアクセスする複数のスレッドがあるため、これは実際にはスレッドセーフではありませんcount_size。私の提案(簡単な修正)はAtomicInteger、intの代わりに使用することです。それらにはアトミック(つまり、相互排除が保証されている)メソッドがgetAndAdd(int size)あり、addAndGet(int size)これを使用して追加できます。スレッドセーフにするには、変数を揮発性にする必要もあります。これにより、ローカルキャッシュが実行されなくなります。例えば:

public static volatile AtomicInteger countSize = new AtomicInteger();

//...
while() {
    //...
    countSize.getAndAdd(beAttributes.size);
    //...
}

int値を取得するには:ThreadTask.countSize.get()

独自のロックを使用して独自のメソッドを作成し、変数に追加することもできます。たとえば、次のようになります。

private static volatile int countSize = 0;
private static Object lock = new Object();


private static void addToSize(int i) {
    synchronized(lock) {
        countSize+=i;
    }
}
public static int getCount() {
    synchronized(lock) { //it is good practice to synch getters too - although not entirely necessary with ints.
        return countSize;
    }
}
于 2013-03-20T04:05:38.093 に答える
0

次の操作はアトミックではありません:</p>

count_size = count_size + size;

以下を試してください:

public static   AtomicInteger countSize = new AtomicInteger()

countSize.getAndAdd(beAttributes.size);
于 2013-03-20T04:27:38.947 に答える