package java_perf.s38system_benchmarks;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import org.junit.Before;
import org.junit.Test;
import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
public final class FalseSharingTest extends AbstractBenchmark {
private final static int THREAD_COUNT = 2;
private final static int ITERATIONS = 10000000;
private AtomicInteger atomicIntegers[];
private AtomicIntegerArray atomicIntegerArray;
private ExecutorService executor;
@Test
public void testNonShared() throws Exception {
for (int j = 0; j < THREAD_COUNT; ++j) {
final int k = j;
executor.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < ITERATIONS; ++i) {
atomicIntegers[k].incrementAndGet();
}
}
});
}
executor.shutdown();
assertTrue(executor.awaitTermination(THREAD_COUNT, TimeUnit.MINUTES));
for (int i = 0; i < THREAD_COUNT; ++i) {
assertEquals(ITERATIONS, atomicIntegers[i].get());
}
}
@Test
public void testShared() throws Exception {
for (int j = 0; j < THREAD_COUNT; ++j) {
final int k = j;
executor.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < ITERATIONS; ++i) {
atomicIntegerArray.incrementAndGet(k);
}
}
});
}
executor.shutdown();
assertTrue(executor.awaitTermination(THREAD_COUNT, TimeUnit.MINUTES));
for (int i = 0; i < THREAD_COUNT; ++i) {
assertEquals(ITERATIONS, atomicIntegerArray.get(i));
}
}
private int getRemainder() {
return ITERATIONS % THREAD_COUNT;
}
@Before
public void setUp() {
assertTrue(Runtime.getRuntime().availableProcessors() >= THREAD_COUNT);
assertTrue(getRemainder() == 0);
executor = Executors.newCachedThreadPool();
atomicIntegers = new AtomicInteger[THREAD_COUNT];
for (int i = 0; i < atomicIntegers.length; ++i) {
atomicIntegers[i] = new AtomicInteger(0);
}
atomicIntegerArray = new AtomicIntegerArray(new int[THREAD_COUNT]);
}
}