From d01b7be0b6476aad67aa9fad3ccdacd6d474d68e Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 21 Feb 2020 14:17:46 +0100 Subject: [PATCH] BAEL-3855 identation, moved to new module, removed needless classes, better benchmark --- lock-striping/pom.xml | 38 +++++----- .../baeldung/concurrent/lock/BenchMark.java | 49 ++++++------- .../concurrent/lock/CoarseGrained.java | 56 +++++++-------- .../concurrent/lock/ConcurrentAccessMap.java | 46 ++++++------ .../baeldung/concurrent/lock/LockStriped.java | 70 +++++++++---------- .../com/baeldung/concurrent/lock/NoLock.java | 34 --------- 6 files changed, 127 insertions(+), 166 deletions(-) delete mode 100644 lock-striping/src/com/baeldung/concurrent/lock/NoLock.java diff --git a/lock-striping/pom.xml b/lock-striping/pom.xml index 79469593cf..0e5310b9da 100644 --- a/lock-striping/pom.xml +++ b/lock-striping/pom.xml @@ -1,31 +1,31 @@ 4.0.0 com.baeldung.concurrent.lock - lock-striping + core-java-concurrency-collections-2 0.0.1-SNAPSHOT - + 1.21 28.2-jre - + - - com.google.guava - guava - ${guava.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - + + com.google.guava + guava + ${guava.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + src diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java index 5aae5145d2..438bcb2f4b 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java @@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; @@ -16,24 +17,18 @@ import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.MILLISECONDS) -@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@Fork(value = 2) +@Warmup(iterations = 3) public class BenchMark { ConcurrentAccessMap accessMyMap; - - @Param({"HashMap", "HashMap with Lock", "HashMap with Striped Lock", - "ConcurrentHashMap", "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) + + @Param({"HashMap with Lock", "HashMap with Striped Lock", + "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) private String type; - - @Setup + + @Setup public void setup() { switch (type) { - case "HashMap": - accessMyMap = new NoLock(getHashMap()); - break; - case "ConcurrentHashMap": - accessMyMap = new NoLock(getConcurrentHashMap()); - break; case "HashMap with Lock": accessMyMap = new CoarseGrained(getHashMap()); break; @@ -48,19 +43,19 @@ public class BenchMark { break; } } - - private Map getHashMap() { - return new HashMap(); - } - - private Map getConcurrentHashMap() { - return new ConcurrentHashMap(); - } - - @Benchmark - @BenchmarkMode(Mode.Throughput) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void test() throws InterruptedException { + + private Map getHashMap() { + return new HashMap(); + } + + private Map getConcurrentHashMap() { + return new ConcurrentHashMap(); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void test() throws InterruptedException { accessMyMap.doWork(type); - } + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java index adc70fc3ab..a9af3e1bba 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java @@ -6,34 +6,34 @@ import java.util.concurrent.locks.ReentrantLock; import com.google.common.base.Supplier; public class CoarseGrained extends ConcurrentAccessMap { - ReentrantLock lock; + ReentrantLock lock; - public CoarseGrained(Map map) { - super(map); - lock = new ReentrantLock(); - } + public CoarseGrained(Map map) { + super(map); + lock = new ReentrantLock(); + } - protected Supplier putSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.put("key" + x, "value" + x); - lock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.get("key" + x); - lock.unlock(); - return null; - }); - } + protected Supplier putSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.put("key" + x, "value" + x); + lock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.get("key" + x); + lock.unlock(); + return null; + }); + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java index 87c305b8aa..00b61cdc09 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java @@ -6,28 +6,28 @@ import java.util.concurrent.CompletableFuture; import com.google.common.base.Supplier; public abstract class ConcurrentAccessMap { - static final int SLOTS = 4; - static final int THREADS = 10000; - static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - private CompletableFuture[] requests; - Map map; - - public ConcurrentAccessMap(Map map) { - this.map = map; - } - - public final void doWork(String type) { - requests = new CompletableFuture[THREADS * SLOTS]; + static final int SLOTS = 4; + static final int THREADS = 10000; + static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + private CompletableFuture[] requests; + protected Map map; + + public ConcurrentAccessMap(Map map) { + this.map = map; + } - for (int i = 0; i < THREADS; i++) { - requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); - requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); + public final void doWork(String type) { + requests = new CompletableFuture[THREADS * SLOTS]; + + for (int i = 0; i < THREADS; i++) { + requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); + requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); } - CompletableFuture.allOf(requests).join(); - } - - protected abstract Supplier putSupplier(int x); - protected abstract Supplier getSupplier(int x); -} + CompletableFuture.allOf(requests).join(); + } + + protected abstract Supplier putSupplier(int x); + protected abstract Supplier getSupplier(int x); +} \ No newline at end of file diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java index 91d72eb362..f162c06f89 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java @@ -7,41 +7,41 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; public class LockStriped extends ConcurrentAccessMap { - Striped lock; + Striped lock; - public LockStriped(Map map) { - super(map); - lock = getStripedLock(); - } + public LockStriped(Map map) { + super(map); + lock = getStripedLock(); + } - private Striped getStripedLock() { - Striped map = Striped.lock(BUCKETS); - return map; - } - - protected Supplier putSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.put("key" + x, "value" + x); - currentLock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.get("key" + x); - currentLock.unlock(); - return null; - }); - } + private Striped getStripedLock() { + Striped map = Striped.lock(BUCKETS); + return map; + } + + protected Supplier putSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + x, "value" + x); + currentLock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + x); + currentLock.unlock(); + return null; + }); + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java deleted file mode 100644 index f2d5b445d7..0000000000 --- a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; - -import com.google.common.base.Supplier; - -public class NoLock extends ConcurrentAccessMap { - - public NoLock(Map map) { - super(map); - } - - protected Supplier putSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - map.put("key" + x, "value" + x); - done = true; - } - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - map.get("key" + x); - done = true; - } - return null; - }); - } -} \ No newline at end of file