diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java index 7c84c39804..4dfbd8ea18 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -1,5 +1,7 @@ package com.baeldung.concurrent.lock; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; @@ -7,14 +9,12 @@ import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Fork(value = 1) +@Fork(value = 2) @Warmup(iterations = 0) public class ConcurrentAccessBenchmark { ConcurrentAccessExperiment accessMyMap; @@ -22,28 +22,31 @@ public class ConcurrentAccessBenchmark { static final int THREADS = 10000; static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - @Param({"Single Lock", "Striped Lock"}) - private String lockType; - - @Param({"HashMap", "ConcurrentHashMap"}) - private String mapType; - - @Setup - public void setup() { - switch (lockType) { - case "Single Lock": - accessMyMap = new SingleLock(); - break; - case "Striped Lock": - accessMyMap = new StripedLock(BUCKETS); - break; - } + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void singleLockHashMap() throws InterruptedException { + (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void test() throws InterruptedException { - accessMyMap.doWork(mapType, THREADS, SLOTS); + public void stripedLockHashMap() throws InterruptedException { + (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void singleLockConcurrentHashMap() throws InterruptedException { + (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void stripedLockConcurrentHashMap() throws InterruptedException { + (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java index b1276410ce..ec6d3895da 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java @@ -1,30 +1,14 @@ package com.baeldung.concurrent.lock; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; import com.google.common.base.Supplier; public abstract class ConcurrentAccessExperiment { - public ConcurrentAccessExperiment() { - } - - private Map doMapSetup(String typeOfMap) { - switch (typeOfMap) { - case "HashMap": - return new HashMap(); - case "ConcurrentHashMap": - return new ConcurrentHashMap(); - } - return null; - } - - public final void doWork(String typeOfMap, int threads, int slots) { + public final Map doWork(Map map, int threads, int slots) { CompletableFuture[] requests = new CompletableFuture[threads * slots]; - Map map = doMapSetup(typeOfMap); for (int i = 0; i < threads; i++) { requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); @@ -33,6 +17,8 @@ public abstract class ConcurrentAccessExperiment { requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); } CompletableFuture.allOf(requests).join(); + + return map; } protected abstract Supplier putSupplier(Map map, int key); diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index fad7243bf4..77bf2de7c0 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -10,12 +10,7 @@ public class StripedLock extends ConcurrentAccessExperiment { Striped lock; public StripedLock(int buckets) { - lock = getStripedLock(buckets); - } - - private Striped getStripedLock(int buckets) { - Striped map = Striped.lock(buckets); - return map; + lock = Striped.lock(buckets); } protected synchronized Supplier putSupplier(Map map, int key) {