From ff4ac10bb2b8f3f0ba74e0ff084f56dff634dee6 Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 11 Mar 2020 13:19:25 +0100 Subject: [PATCH] BAEL-3855 --- .../baeldung/concurrent/lock/BenchMark.java | 48 ------------------- .../concurrent/lock/ConcurrentAccessMap.java | 48 ------------------- .../baeldung/concurrent/lock/SingleLock.java | 26 ++++++---- .../baeldung/concurrent/lock/StripedLock.java | 26 ++++++---- 4 files changed, 32 insertions(+), 116 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java deleted file mode 100644 index 5d9e382351..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java +++ /dev/null @@ -1,48 +0,0 @@ -package main.java.com.baeldung.concurrent.lock; -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.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) -@Warmup(iterations = 0) -public class BenchMark { - ConcurrentAccessMap accessMyMap; - static final int SLOTS = 4; - static final int THREADS = 1000; - 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 test() throws InterruptedException { - accessMyMap.doWork(mapType, THREADS, SLOTS); - } -} diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java deleted file mode 100644 index e5fcd6d406..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java +++ /dev/null @@ -1,48 +0,0 @@ -package main.java.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 ConcurrentAccessMap { - - public ConcurrentAccessMap() { - } - - private Map getHashMap() { - return new HashMap(); - } - - private Map getConcurrentHashMap() { - return new ConcurrentHashMap(); - } - - private Map setup(String type) { - switch (type) { - case "HashMap": - return getHashMap(); - case "ConcurrentHashMap": - return getConcurrentHashMap(); - } - return null; - } - - public final void doWork(String type, int threads, int slots) { - CompletableFuture[] requests = new CompletableFuture[threads * slots]; - Map map = setup(type); - - for (int i = 0; i < threads; i++) { - requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); - requests[slots * i + 1] = CompletableFuture.supplyAsync(getSupplier(map, i)); - requests[slots * i + 2] = CompletableFuture.supplyAsync(getSupplier(map, i)); - requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); - } - CompletableFuture.allOf(requests).join(); - } - - protected abstract Supplier putSupplier(Map map, int key); - protected abstract Supplier getSupplier(Map map, int key); -} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 4f0fe0222a..8a3106f650 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -1,11 +1,11 @@ -package main.java.com.baeldung.concurrent.lock; +package com.baeldung.concurrent.lock; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; import com.google.common.base.Supplier; -public class SingleLock extends ConcurrentAccessMap { +public class SingleLock extends ConcurrentAccessExperiment { ReentrantLock lock; public SingleLock() { @@ -15,11 +15,14 @@ public class SingleLock extends ConcurrentAccessMap { protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { boolean done = false; - while(!done) { - done = lock.tryLock(); + try { + while(!done) { + done = lock.tryLock(); + } + map.put("key" + key, "value" + key); + } finally { + lock.unlock(); } - map.put("key" + key, "value" + key); - lock.unlock(); return null; }); } @@ -27,11 +30,14 @@ public class SingleLock extends ConcurrentAccessMap { protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { boolean done = false; - while(!done) { - done = lock.tryLock(); + try { + while(!done) { + done = lock.tryLock(); + } + map.get("key" + key); + } finally { + lock.unlock(); } - map.get("key" + key); - lock.unlock(); return null; }); } 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 fe98dd82be..fad7243bf4 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 @@ -1,4 +1,4 @@ -package main.java.com.baeldung.concurrent.lock; +package com.baeldung.concurrent.lock; import java.util.Map; import java.util.concurrent.locks.Lock; @@ -6,7 +6,7 @@ import java.util.concurrent.locks.Lock; import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; -public class StripedLock extends ConcurrentAccessMap { +public class StripedLock extends ConcurrentAccessExperiment { Striped lock; public StripedLock(int buckets) { @@ -22,11 +22,14 @@ public class StripedLock extends ConcurrentAccessMap { return (()-> { Lock currentLock = lock.get("key" + key); boolean done = false; - while(!done) { - done = currentLock.tryLock(); + try { + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + key, "value" + key); + } finally { + currentLock.unlock(); } - map.put("key" + key, "value" + key); - currentLock.unlock(); return null; }); } @@ -35,11 +38,14 @@ public class StripedLock extends ConcurrentAccessMap { return (()-> { Lock currentLock = lock.get("key" + key); boolean done = false; - while(!done) { - done = currentLock.tryLock(); + try { + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + key); + } finally { + currentLock.unlock(); } - map.get("key" + key); - currentLock.unlock(); return null; }); }