package simple1; import test.Test; // @NotThreadSafe public class MultipleUpdatesPerThread { private static long result; private MultipleUpdatesPerThread() { // Cannot be instantiated } private static void addPartialResult(long partial) { result += partial; } public static long sum(int[] nums) throws Exception { result = 0; Thread[] threads = new Thread[Test.NUM_THREADS]; int size = (int) Math.ceil((double) nums.length / Test.NUM_THREADS); for (int i = 0; i < Test.NUM_THREADS; i++) { threads[i] = new Thread( new SumMultipleUpdates(nums, i * size, (i + 1) * size)); threads[i].start(); } for (Thread thread : threads) { thread.join(); } return result; } static class SumMultipleUpdates implements Runnable { private final int[] nums; private final int low; private final int high; public SumMultipleUpdates(int[] nums, int low, int high) { this.nums = nums; this.low = low; this.high = Math.min(high, nums.length); } public void run() { for (int i = low; i < high; i++) { MultipleUpdatesPerThread.addPartialResult(nums[i]); } } } }