From 2e4de12d4f77a3e3ede527ca2c1d1f3e9e4e6f67 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 5 Dec 2019 11:32:58 +0100 Subject: [PATCH 01/23] Hexagonal architecture: a quick and practical example --- hexagonal-architecture-poc/pom.xml | 44 +++++++++++++++++++ .../HexagonalArchitecturePocApplication.java | 13 ++++++ .../boundary/input/OrderService.java | 11 +++++ .../boundary/output/OrderRepository.java | 11 +++++ .../hexagonal/core/entities/Order.java | 27 ++++++++++++ .../core/services/OrderServiceImpl.java | 35 +++++++++++++++ .../hexagonal/outside/OrderController.java | 32 ++++++++++++++ .../src/main/resources/application.properties | 5 +++ 8 files changed, 178 insertions(+) create mode 100644 hexagonal-architecture-poc/pom.xml create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java create mode 100644 hexagonal-architecture-poc/src/main/resources/application.properties diff --git a/hexagonal-architecture-poc/pom.xml b/hexagonal-architecture-poc/pom.xml new file mode 100644 index 0000000000..b31a6dec90 --- /dev/null +++ b/hexagonal-architecture-poc/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.5.RELEASE + + + com.baeldung + hexagonal-architecture-poc + 0.0.1-SNAPSHOT + hexagonal-architecture-poc + Demo project for Hexagonal Architecture POC + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java new file mode 100644 index 0000000000..1690fbbeb5 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.hexagonal; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HexagonalArchitecturePocApplication { + + public static void main(String[] args) { + SpringApplication.run(HexagonalArchitecturePocApplication.class, args); + } + +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java new file mode 100644 index 0000000000..07793f75ab --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.boundary.input; + +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.core.entities.Order; + +@Service public interface OrderService { + Iterable getOrders(); + Order createOrder(Double total); + boolean registerOrder(Order order); +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java new file mode 100644 index 0000000000..ea1d38d296 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.boundary.output; + +import java.util.List; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.hexagonal.core.entities.Order; + +@Repository public interface OrderRepository extends CrudRepository{ +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java new file mode 100644 index 0000000000..db0c4efd54 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java @@ -0,0 +1,27 @@ +package com.baeldung.hexagonal.core.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity @Table(name="Orders") public class Order { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; + Double total; + + public Order() { + super(); + } + public Double getTotal() { + return total; + } + public void setTotal(Double total) { + this.total = total; + } + public Long getId() { + return id; + } + + +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java new file mode 100644 index 0000000000..d3d8f1ba6a --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java @@ -0,0 +1,35 @@ +package com.baeldung.hexagonal.core.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.boundary.input.OrderService; +import com.baeldung.hexagonal.boundary.output.OrderRepository; +import com.baeldung.hexagonal.core.entities.Order; + +@Service public class OrderServiceImpl implements OrderService { + + @Autowired OrderRepository orderRepository; + + @Override + public Iterable getOrders() { + return orderRepository.findAll(); + } + + @Override + public boolean registerOrder(Order order) { + if (order.getTotal() > 0) + orderRepository.save(order); + else + return false; + + return true; + } + + @Override + public Order createOrder(Double total) { + Order order = new Order(); + order.setTotal(total); + return order; + } +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java new file mode 100644 index 0000000000..85c2e42368 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java @@ -0,0 +1,32 @@ +package com.baeldung.hexagonal.outside; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.hexagonal.boundary.input.OrderService; +import com.baeldung.hexagonal.core.entities.Order; + +@RestController public class OrderController { + + @Autowired OrderService orderService; + + @GetMapping(path = "/orders/list") + public Iterable getOrders(){ + return orderService.getOrders(); + } + + @GetMapping(path = "/orders/add") + public String placeOrder(@RequestParam Double total) { + boolean isPlaced = orderService.registerOrder(orderService.createOrder(total)); + return isPlaced ? "Ok" : "Nok"; + } + + @GetMapping(path = "/orders/add-commission") + public String placeCommissionOrder(@RequestParam Double total) { + boolean isPlaced = orderService.registerOrder(orderService.createOrder(total*1.05)); + return isPlaced ? "Ok" : "Nok"; + } + +} diff --git a/hexagonal-architecture-poc/src/main/resources/application.properties b/hexagonal-architecture-poc/src/main/resources/application.properties new file mode 100644 index 0000000000..bc2fdde8c1 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect From b48f01d324bf1d3439eaa4b7337f541f842da0d0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 09:28:02 +0100 Subject: [PATCH 02/23] BAEL 3486 --- .../baeldung/algorithms/greedy/Follower.java | 20 ++++++ .../algorithms/greedy/FollowersPath.java | 44 +++++++++++++ .../algorithms/greedy/GreedyAlgorithm.java | 47 +++++++++++++ .../algorithms/greedy/NonGreedyAlgorithm.java | 44 +++++++++++++ .../algorithms/greedy/SocialConnector.java | 36 ++++++++++ .../algorithms/greedy/SocialUser.java | 38 +++++++++++ .../greedy/GreedyAlgorithmUnitTest.java | 66 +++++++++++++++++++ 7 files changed, 295 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java new file mode 100644 index 0000000000..e24b29f5cb --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.greedy; + +import lombok.Getter; + +public class Follower { + + @Getter String username; + @Getter long count; + + public Follower(String username, long count) { + super(); + this.username = username; + this.count = count; + } + + @Override + public String toString() { + return "User: " + username + ", Followers: " + count + "\n\r" ; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java new file mode 100644 index 0000000000..932037edb1 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +public class FollowersPath { + + private List accounts; + private long count; + + public FollowersPath() { + super(); + this.accounts = new ArrayList<>(); + } + + public List getAccounts() { + return accounts; + } + public long getCount() { + return count; + } + + public void addFollower(String username, long count) { + accounts.add(new Follower(username, count)); + } + + public void addCount(long count) { + this.count += count; + } + + @Override + public String toString() { + String details = ""; + for(Follower a : accounts) { + details+=a.toString() + ", "; + } + + return "Total: " + count + ", \n\r" + + " Details: { " + "\n\r" + + details + "\n\r" + + " }"; + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java new file mode 100644 index 0000000000..891695e5dc --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java @@ -0,0 +1,47 @@ +package com.baeldung.algorithms.greedy; + +import java.util.List; + +public class GreedyAlgorithm { + + int currentLevel = 0; + final int maxLevel = 3; + SocialConnector sc; + FollowersPath fp; + + public GreedyAlgorithm(SocialConnector sc) { + super(); + this.sc = sc; + this.fp = new FollowersPath(); + } + + public long findMostFollowersPath(String account) throws Exception { + long max = 0; + SocialUser toFollow = null; + + List followers = sc.getFollowers(account); + for (SocialUser el : followers) { + long followersCount = el.getFollowersCount(); + if (followersCount > max) { + toFollow = el; + max = followersCount; + } + } + + if (currentLevel < maxLevel - 1) { + currentLevel++; + max += findMostFollowersPath(toFollow.getUsername()); + //fp.addFollower(toFollow.getUsername(), max); + //fp.addCount(max); + return max; + } else { + //fp.addFollower(toFollow.getUsername(), max); + //fp.addCount(max); + return max; + } + } + + public FollowersPath getFollowers() { + return fp; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java new file mode 100644 index 0000000000..db8a47be11 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.greedy; + +import java.util.List; + +public class NonGreedyAlgorithm { + + int currentLevel = 0; + final int maxLevel = 3; + SocialConnector tc; + + public NonGreedyAlgorithm(SocialConnector tc, int level) { + super(); + this.tc = tc; + this.currentLevel = level; + } + + + public long findMostFollowersPath(String account) throws Exception { + List followers = tc.getFollowers(account); + long total = currentLevel > 0 ? followers.size() : 0; + + if (currentLevel < maxLevel ) { + currentLevel++; + + long[] count = new long[followers.size()]; + int i = 0; + for (SocialUser el : followers) { + NonGreedyAlgorithm sub = new NonGreedyAlgorithm(tc, currentLevel); + count[i] = sub.findMostFollowersPath(el.getUsername()); + i++; + } + + long max = 0; + for (; i > 0; i--) { + if (count[i-1] > max ) + max = count[i-1]; + } + + return total + max; + } + + return total; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java new file mode 100644 index 0000000000..cdcf0df395 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java @@ -0,0 +1,36 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +public class SocialConnector { + private boolean isCounterEnabled = true; + private int counter = 4; + @Getter @Setter List users; + + public SocialConnector() { + users = new ArrayList<>(); + } + + public boolean switchCounter() { + this.isCounterEnabled = !this.isCounterEnabled; + return this.isCounterEnabled; + } + + public List getFollowers(String account) throws Exception { + if (counter < 0) + throw new Exception ("API limit reached"); + else { + if(this.isCounterEnabled) counter--; + for(SocialUser user : users) { + if (user.getUsername().equals(account)) { + return user.getFollowers(); + } + } + } + return new ArrayList<>(); + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java new file mode 100644 index 0000000000..33eab9e799 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; + +public class SocialUser { + + @Getter private String username; + @Getter private List followers; + + public SocialUser(String username) { + super(); + this.username = username; + this.followers = new ArrayList<>(); + } + + public SocialUser(String username, List followers) { + super(); + this.username = username; + this.followers = followers; + } + + public long getFollowersCount() { + return followers.size(); + } + + public void addFollowers(List followers) { + this.followers.addAll(followers); + } + + @Override + public boolean equals(Object obj) { + return ((SocialUser) obj).getUsername().equals(username); + } + +} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java new file mode 100644 index 0000000000..3560657ace --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.algorithms.greedy; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class GreedyAlgorithmUnitTest { + + private SocialConnector prepareNetwork() { + SocialConnector sc = new SocialConnector(); + + SocialUser root = new SocialUser("root"); + SocialUser child1 = new SocialUser("child1"); + SocialUser child2 = new SocialUser("child2"); + SocialUser child3 = new SocialUser("child3"); + SocialUser child21 = new SocialUser("child21"); + SocialUser child211 = new SocialUser("child211"); + SocialUser child2111 = new SocialUser("child2111"); + SocialUser child31 = new SocialUser("child31"); + SocialUser child311 = new SocialUser("child311"); + SocialUser child3111 = new SocialUser("child3111"); + + + child211.addFollowers(Arrays.asList(new SocialUser[]{child2111})); + child311.addFollowers(Arrays.asList(new SocialUser[]{child3111})); + + child21.addFollowers(Arrays.asList(new SocialUser[]{child211})); + child31.addFollowers(Arrays.asList(new SocialUser[]{child311, + new SocialUser("child312"), new SocialUser("child313"), new SocialUser("child314")})); + + child1.addFollowers(Arrays.asList(new SocialUser[]{new SocialUser("child11"), new SocialUser("child12")})); + child2.addFollowers(Arrays.asList(new SocialUser[]{child21, new SocialUser("child22"), new SocialUser("child23")})); + child3.addFollowers(Arrays.asList(new SocialUser[]{child31})); + + root.addFollowers(Arrays.asList(new SocialUser[]{child1, child2, child3})); + + sc.setUsers(Arrays.asList(new SocialUser[]{root, child1, child2, child3, child21, child31, child311, child211})); + return sc; + } + + @Test + public void greedyAlgorithmTest() throws Exception { + GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork()); + assertEquals(ga.findMostFollowersPath("root"), 5); + } + + @Test + public void nongreedyAlgorithmTest() throws Exception { + NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0); + Assertions.assertThrows(Exception.class, () -> { + nga.findMostFollowersPath("root"); + }); + } + + @Test + public void nongreedyAlgorithmUnboundedTest() throws Exception { + SocialConnector sc = prepareNetwork(); + sc.switchCounter(); + NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0); + assertEquals(nga.findMostFollowersPath("root"), 6); + } + +} \ No newline at end of file From 34d04156fc8033181c42c956ff3ef148e8c9bc09 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:14:00 +0100 Subject: [PATCH 03/23] BAEL-3855 Lock Striping --- lock-striping/pom.xml | 43 ++++++++++++ .../baeldung/concurrent/lock/BenchMark.java | 66 +++++++++++++++++++ .../concurrent/lock/CoarseGrained.java | 39 +++++++++++ .../concurrent/lock/ConcurrentAccessMap.java | 33 ++++++++++ .../baeldung/concurrent/lock/LockStriped.java | 47 +++++++++++++ .../com/baeldung/concurrent/lock/NoLock.java | 34 ++++++++++ 6 files changed, 262 insertions(+) create mode 100644 lock-striping/pom.xml create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/NoLock.java diff --git a/lock-striping/pom.xml b/lock-striping/pom.xml new file mode 100644 index 0000000000..79469593cf --- /dev/null +++ b/lock-striping/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + com.baeldung.concurrent.lock + lock-striping + 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} + + + + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java new file mode 100644 index 0000000000..5aae5145d2 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java @@ -0,0 +1,66 @@ +package com.baeldung.concurrent.lock; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +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) +@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) +public class BenchMark { + ConcurrentAccessMap accessMyMap; + + @Param({"HashMap", "HashMap with Lock", "HashMap with Striped Lock", + "ConcurrentHashMap", "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) + private String type; + + @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; + case "ConcurrentHashMap with Lock": + accessMyMap = new CoarseGrained(getConcurrentHashMap()); + break; + case "HashMap with Striped Lock": + accessMyMap = new LockStriped(getHashMap()); + break; + case "ConcurrentHashMap with Striped Lock": + accessMyMap = new LockStriped(getConcurrentHashMap()); + 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 { + 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 new file mode 100644 index 0000000000..adc70fc3ab --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java @@ -0,0 +1,39 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +import com.google.common.base.Supplier; + +public class CoarseGrained extends ConcurrentAccessMap { + ReentrantLock lock; + + 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; + }); + } +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java new file mode 100644 index 0000000000..87c305b8aa --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +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]; + + 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); +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java new file mode 100644 index 0000000000..91d72eb362 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java @@ -0,0 +1,47 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.Lock; + +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.Striped; + +public class LockStriped extends ConcurrentAccessMap { + Striped lock; + + 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; + }); + } +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java new file mode 100644 index 0000000000..f2d5b445d7 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java @@ -0,0 +1,34 @@ +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 From 72ea7a14e6bf9e00ca20e592c5d49bc7376bc82b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:26:24 +0100 Subject: [PATCH 04/23] BAEL-3855 --- .../baeldung/algorithms/greedy/Follower.java | 20 -------- .../algorithms/greedy/FollowersPath.java | 44 ----------------- .../algorithms/greedy/GreedyAlgorithm.java | 47 ------------------- .../algorithms/greedy/NonGreedyAlgorithm.java | 44 ----------------- .../algorithms/greedy/SocialConnector.java | 36 -------------- .../algorithms/greedy/SocialUser.java | 38 --------------- 6 files changed, 229 deletions(-) delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java deleted file mode 100644 index e24b29f5cb..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import lombok.Getter; - -public class Follower { - - @Getter String username; - @Getter long count; - - public Follower(String username, long count) { - super(); - this.username = username; - this.count = count; - } - - @Override - public String toString() { - return "User: " + username + ", Followers: " + count + "\n\r" ; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java deleted file mode 100644 index 932037edb1..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -public class FollowersPath { - - private List accounts; - private long count; - - public FollowersPath() { - super(); - this.accounts = new ArrayList<>(); - } - - public List getAccounts() { - return accounts; - } - public long getCount() { - return count; - } - - public void addFollower(String username, long count) { - accounts.add(new Follower(username, count)); - } - - public void addCount(long count) { - this.count += count; - } - - @Override - public String toString() { - String details = ""; - for(Follower a : accounts) { - details+=a.toString() + ", "; - } - - return "Total: " + count + ", \n\r" + - " Details: { " + "\n\r" + - details + "\n\r" + - " }"; - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java deleted file mode 100644 index 891695e5dc..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.List; - -public class GreedyAlgorithm { - - int currentLevel = 0; - final int maxLevel = 3; - SocialConnector sc; - FollowersPath fp; - - public GreedyAlgorithm(SocialConnector sc) { - super(); - this.sc = sc; - this.fp = new FollowersPath(); - } - - public long findMostFollowersPath(String account) throws Exception { - long max = 0; - SocialUser toFollow = null; - - List followers = sc.getFollowers(account); - for (SocialUser el : followers) { - long followersCount = el.getFollowersCount(); - if (followersCount > max) { - toFollow = el; - max = followersCount; - } - } - - if (currentLevel < maxLevel - 1) { - currentLevel++; - max += findMostFollowersPath(toFollow.getUsername()); - //fp.addFollower(toFollow.getUsername(), max); - //fp.addCount(max); - return max; - } else { - //fp.addFollower(toFollow.getUsername(), max); - //fp.addCount(max); - return max; - } - } - - public FollowersPath getFollowers() { - return fp; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java deleted file mode 100644 index db8a47be11..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.List; - -public class NonGreedyAlgorithm { - - int currentLevel = 0; - final int maxLevel = 3; - SocialConnector tc; - - public NonGreedyAlgorithm(SocialConnector tc, int level) { - super(); - this.tc = tc; - this.currentLevel = level; - } - - - public long findMostFollowersPath(String account) throws Exception { - List followers = tc.getFollowers(account); - long total = currentLevel > 0 ? followers.size() : 0; - - if (currentLevel < maxLevel ) { - currentLevel++; - - long[] count = new long[followers.size()]; - int i = 0; - for (SocialUser el : followers) { - NonGreedyAlgorithm sub = new NonGreedyAlgorithm(tc, currentLevel); - count[i] = sub.findMostFollowersPath(el.getUsername()); - i++; - } - - long max = 0; - for (; i > 0; i--) { - if (count[i-1] > max ) - max = count[i-1]; - } - - return total + max; - } - - return total; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java deleted file mode 100644 index cdcf0df395..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -public class SocialConnector { - private boolean isCounterEnabled = true; - private int counter = 4; - @Getter @Setter List users; - - public SocialConnector() { - users = new ArrayList<>(); - } - - public boolean switchCounter() { - this.isCounterEnabled = !this.isCounterEnabled; - return this.isCounterEnabled; - } - - public List getFollowers(String account) throws Exception { - if (counter < 0) - throw new Exception ("API limit reached"); - else { - if(this.isCounterEnabled) counter--; - for(SocialUser user : users) { - if (user.getUsername().equals(account)) { - return user.getFollowers(); - } - } - } - return new ArrayList<>(); - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java deleted file mode 100644 index 33eab9e799..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Getter; - -public class SocialUser { - - @Getter private String username; - @Getter private List followers; - - public SocialUser(String username) { - super(); - this.username = username; - this.followers = new ArrayList<>(); - } - - public SocialUser(String username, List followers) { - super(); - this.username = username; - this.followers = followers; - } - - public long getFollowersCount() { - return followers.size(); - } - - public void addFollowers(List followers) { - this.followers.addAll(followers); - } - - @Override - public boolean equals(Object obj) { - return ((SocialUser) obj).getUsername().equals(username); - } - -} From 510c474ef568f59bdb3c0832385d971b41dd9747 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:27:45 +0100 Subject: [PATCH 05/23] BAEL-3855 --- .../greedy/GreedyAlgorithmUnitTest.java | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java deleted file mode 100644 index 3560657ace..0000000000 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class GreedyAlgorithmUnitTest { - - private SocialConnector prepareNetwork() { - SocialConnector sc = new SocialConnector(); - - SocialUser root = new SocialUser("root"); - SocialUser child1 = new SocialUser("child1"); - SocialUser child2 = new SocialUser("child2"); - SocialUser child3 = new SocialUser("child3"); - SocialUser child21 = new SocialUser("child21"); - SocialUser child211 = new SocialUser("child211"); - SocialUser child2111 = new SocialUser("child2111"); - SocialUser child31 = new SocialUser("child31"); - SocialUser child311 = new SocialUser("child311"); - SocialUser child3111 = new SocialUser("child3111"); - - - child211.addFollowers(Arrays.asList(new SocialUser[]{child2111})); - child311.addFollowers(Arrays.asList(new SocialUser[]{child3111})); - - child21.addFollowers(Arrays.asList(new SocialUser[]{child211})); - child31.addFollowers(Arrays.asList(new SocialUser[]{child311, - new SocialUser("child312"), new SocialUser("child313"), new SocialUser("child314")})); - - child1.addFollowers(Arrays.asList(new SocialUser[]{new SocialUser("child11"), new SocialUser("child12")})); - child2.addFollowers(Arrays.asList(new SocialUser[]{child21, new SocialUser("child22"), new SocialUser("child23")})); - child3.addFollowers(Arrays.asList(new SocialUser[]{child31})); - - root.addFollowers(Arrays.asList(new SocialUser[]{child1, child2, child3})); - - sc.setUsers(Arrays.asList(new SocialUser[]{root, child1, child2, child3, child21, child31, child311, child211})); - return sc; - } - - @Test - public void greedyAlgorithmTest() throws Exception { - GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork()); - assertEquals(ga.findMostFollowersPath("root"), 5); - } - - @Test - public void nongreedyAlgorithmTest() throws Exception { - NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0); - Assertions.assertThrows(Exception.class, () -> { - nga.findMostFollowersPath("root"); - }); - } - - @Test - public void nongreedyAlgorithmUnboundedTest() throws Exception { - SocialConnector sc = prepareNetwork(); - sc.switchCounter(); - NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0); - assertEquals(nga.findMostFollowersPath("root"), 6); - } - -} \ No newline at end of file From d144322c45d0a5f6940bfa9939307450c0de9291 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:28:54 +0100 Subject: [PATCH 06/23] BAEL-3855 --- hexagonal-architecture-poc/pom.xml | 44 ------------------- .../HexagonalArchitecturePocApplication.java | 13 ------ .../boundary/input/OrderService.java | 11 ----- .../boundary/output/OrderRepository.java | 11 ----- .../hexagonal/core/entities/Order.java | 27 ------------ .../core/services/OrderServiceImpl.java | 35 --------------- .../hexagonal/outside/OrderController.java | 32 -------------- .../src/main/resources/application.properties | 5 --- 8 files changed, 178 deletions(-) delete mode 100644 hexagonal-architecture-poc/pom.xml delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java delete mode 100644 hexagonal-architecture-poc/src/main/resources/application.properties diff --git a/hexagonal-architecture-poc/pom.xml b/hexagonal-architecture-poc/pom.xml deleted file mode 100644 index b31a6dec90..0000000000 --- a/hexagonal-architecture-poc/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.0.5.RELEASE - - - com.baeldung - hexagonal-architecture-poc - 0.0.1-SNAPSHOT - hexagonal-architecture-poc - Demo project for Hexagonal Architecture POC - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - runtime - - - org.springframework.boot - spring-boot-starter-web - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java deleted file mode 100644 index 1690fbbeb5..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.hexagonal; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HexagonalArchitecturePocApplication { - - public static void main(String[] args) { - SpringApplication.run(HexagonalArchitecturePocApplication.class, args); - } - -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java deleted file mode 100644 index 07793f75ab..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.hexagonal.boundary.input; - -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.core.entities.Order; - -@Service public interface OrderService { - Iterable getOrders(); - Order createOrder(Double total); - boolean registerOrder(Order order); -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java deleted file mode 100644 index ea1d38d296..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.hexagonal.boundary.output; - -import java.util.List; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -import com.baeldung.hexagonal.core.entities.Order; - -@Repository public interface OrderRepository extends CrudRepository{ -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java deleted file mode 100644 index db0c4efd54..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.hexagonal.core.entities; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity @Table(name="Orders") public class Order { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; - Double total; - - public Order() { - super(); - } - public Double getTotal() { - return total; - } - public void setTotal(Double total) { - this.total = total; - } - public Long getId() { - return id; - } - - -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java deleted file mode 100644 index d3d8f1ba6a..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.hexagonal.core.services; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.boundary.input.OrderService; -import com.baeldung.hexagonal.boundary.output.OrderRepository; -import com.baeldung.hexagonal.core.entities.Order; - -@Service public class OrderServiceImpl implements OrderService { - - @Autowired OrderRepository orderRepository; - - @Override - public Iterable getOrders() { - return orderRepository.findAll(); - } - - @Override - public boolean registerOrder(Order order) { - if (order.getTotal() > 0) - orderRepository.save(order); - else - return false; - - return true; - } - - @Override - public Order createOrder(Double total) { - Order order = new Order(); - order.setTotal(total); - return order; - } -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java deleted file mode 100644 index 85c2e42368..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.hexagonal.outside; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.hexagonal.boundary.input.OrderService; -import com.baeldung.hexagonal.core.entities.Order; - -@RestController public class OrderController { - - @Autowired OrderService orderService; - - @GetMapping(path = "/orders/list") - public Iterable getOrders(){ - return orderService.getOrders(); - } - - @GetMapping(path = "/orders/add") - public String placeOrder(@RequestParam Double total) { - boolean isPlaced = orderService.registerOrder(orderService.createOrder(total)); - return isPlaced ? "Ok" : "Nok"; - } - - @GetMapping(path = "/orders/add-commission") - public String placeCommissionOrder(@RequestParam Double total) { - boolean isPlaced = orderService.registerOrder(orderService.createOrder(total*1.05)); - return isPlaced ? "Ok" : "Nok"; - } - -} diff --git a/hexagonal-architecture-poc/src/main/resources/application.properties b/hexagonal-architecture-poc/src/main/resources/application.properties deleted file mode 100644 index bc2fdde8c1..0000000000 --- a/hexagonal-architecture-poc/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect From d01b7be0b6476aad67aa9fad3ccdacd6d474d68e Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 21 Feb 2020 14:17:46 +0100 Subject: [PATCH 07/23] 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 From 41d82b78f5de6d0f247d4e39e8cd8c916427d788 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 22 Feb 2020 12:34:10 +0100 Subject: [PATCH 08/23] BAEL-3855 Tree update --- {lock-striping => core-java-concurrency-collections-2}/pom.xml | 0 .../src/com/baeldung/concurrent/lock/BenchMark.java | 0 .../src/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../src/com/baeldung/concurrent/lock/LockStriped.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {lock-striping => core-java-concurrency-collections-2}/pom.xml (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/BenchMark.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/lock-striping/pom.xml b/core-java-concurrency-collections-2/pom.xml similarity index 100% rename from lock-striping/pom.xml rename to core-java-concurrency-collections-2/pom.xml diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java From 0fc23d01e519741b417620f517041aef7747eadf Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 24 Feb 2020 10:10:02 +0100 Subject: [PATCH 09/23] BAEL-3855 tree fix --- .../{ => main/java}/com/baeldung/concurrent/lock/BenchMark.java | 0 .../java}/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../java}/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../{ => main/java}/com/baeldung/concurrent/lock/LockStriped.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/BenchMark.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java From 79be75cd74e17ae9000abbc025c81bb69cb80560 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 25 Feb 2020 10:31:59 +0100 Subject: [PATCH 10/23] BAEL-3855 Moved to java-core-modules folder --- .../core-java-concurrency-collections-2}/pom.xml | 0 .../src/main/java/com/baeldung/concurrent/lock/BenchMark.java | 0 .../src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../src/main/java/com/baeldung/concurrent/lock/LockStriped.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/pom.xml (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/BenchMark.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml similarity index 100% rename from core-java-concurrency-collections-2/pom.xml rename to core-java-modules/core-java-concurrency-collections-2/pom.xml diff --git a/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 similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/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 similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java From 636e76ade03ef610f4ceee65886b97c32f7d0ea2 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 9 Mar 2020 16:43:35 +0100 Subject: [PATCH 11/23] BAEL-3855 Updated --- .../baeldung/concurrent/lock/BenchMark.java | 47 +++++++---------- .../concurrent/lock/ConcurrentAccessMap.java | 51 ++++++++++++------- .../baeldung/concurrent/lock/SingleLock.java | 38 ++++++++++++++ .../baeldung/concurrent/lock/StripedLock.java | 46 +++++++++++++++++ 4 files changed, 134 insertions(+), 48 deletions(-) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.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 index 438bcb2f4b..5d9e382351 100644 --- 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 @@ -1,13 +1,9 @@ -package com.baeldung.concurrent.lock; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +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.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; @@ -17,45 +13,36 @@ import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Fork(value = 2) -@Warmup(iterations = 3) +@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({"HashMap with Lock", "HashMap with Striped Lock", - "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) - private String type; + @Param({"Single Lock", "Striped Lock"}) + private String lockType; + @Param({"HashMap", "ConcurrentHashMap"}) + private String mapType; + @Setup public void setup() { - switch (type) { - case "HashMap with Lock": - accessMyMap = new CoarseGrained(getHashMap()); + switch (lockType) { + case "Single Lock": + accessMyMap = new SingleLock(); break; - case "ConcurrentHashMap with Lock": - accessMyMap = new CoarseGrained(getConcurrentHashMap()); - break; - case "HashMap with Striped Lock": - accessMyMap = new LockStriped(getHashMap()); - break; - case "ConcurrentHashMap with Striped Lock": - accessMyMap = new LockStriped(getConcurrentHashMap()); + case "Striped Lock": + accessMyMap = new StripedLock(BUCKETS); 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 { - accessMyMap.doWork(type); + 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 index 00b61cdc09..e5fcd6d406 100644 --- 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 @@ -1,33 +1,48 @@ -package com.baeldung.concurrent.lock; +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 { - 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; + public ConcurrentAccessMap() { + } + + private Map getHashMap() { + return new HashMap(); } - public final void doWork(String type) { - requests = new CompletableFuture[THREADS * SLOTS]; + private Map getConcurrentHashMap() { + return new ConcurrentHashMap(); + } + + private Map setup(String type) { + switch (type) { + case "HashMap": + return getHashMap(); + case "ConcurrentHashMap": + return getConcurrentHashMap(); + } + return null; + } - 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, 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(int x); - protected abstract Supplier getSupplier(int x); + 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 new file mode 100644 index 0000000000..4f0fe0222a --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -0,0 +1,38 @@ +package main.java.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 { + ReentrantLock lock; + + public SingleLock() { + lock = new ReentrantLock(); + } + + protected synchronized Supplier putSupplier(Map map, int key) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.put("key" + key, "value" + key); + lock.unlock(); + return null; + }); + } + + protected synchronized Supplier getSupplier(Map map, int key) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + 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 new file mode 100644 index 0000000000..fe98dd82be --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -0,0 +1,46 @@ +package main.java.com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.Lock; + +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.Striped; + +public class StripedLock extends ConcurrentAccessMap { + Striped lock; + + public StripedLock(int buckets) { + lock = getStripedLock(buckets); + } + + private Striped getStripedLock(int buckets) { + Striped map = Striped.lock(buckets); + return map; + } + + protected synchronized Supplier putSupplier(Map map, int key) { + return (()-> { + Lock currentLock = lock.get("key" + key); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + key, "value" + key); + currentLock.unlock(); + return null; + }); + } + + protected synchronized Supplier getSupplier(Map map, int key) { + return (()-> { + Lock currentLock = lock.get("key" + key); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + key); + currentLock.unlock(); + return null; + }); + } +} From 1470deb1878580e3e46a8ebcbb1538c4d94df0da Mon Sep 17 00:00:00 2001 From: mguarnaccia Date: Wed, 11 Mar 2020 11:20:37 +0100 Subject: [PATCH 12/23] Delete CoarseGrained.java --- .../concurrent/lock/CoarseGrained.java | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java deleted file mode 100644 index a9af3e1bba..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; - -import com.google.common.base.Supplier; - -public class CoarseGrained extends ConcurrentAccessMap { - ReentrantLock lock; - - 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; - }); - } -} From 52608c32cbee8cb73f261a78106ae9417cbfe615 Mon Sep 17 00:00:00 2001 From: mguarnaccia Date: Wed, 11 Mar 2020 11:21:01 +0100 Subject: [PATCH 13/23] Delete LockStriped.java --- .../baeldung/concurrent/lock/LockStriped.java | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java deleted file mode 100644 index f162c06f89..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; -import java.util.concurrent.locks.Lock; - -import com.google.common.base.Supplier; -import com.google.common.util.concurrent.Striped; - -public class LockStriped extends ConcurrentAccessMap { - Striped lock; - - 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; - }); - } -} From ff4ac10bb2b8f3f0ba74e0ff084f56dff634dee6 Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 11 Mar 2020 13:19:25 +0100 Subject: [PATCH 14/23] 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; }); } From 2302a4abb7ee65da888823e0362a65011f95ee8b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 14:31:36 +0100 Subject: [PATCH 15/23] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 49 +++++++++++++++++++ .../lock/ConcurrentAccessExperiment.java | 40 +++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java 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 new file mode 100644 index 0000000000..7c84c39804 --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -0,0 +1,49 @@ +package 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 ConcurrentAccessBenchmark { + ConcurrentAccessExperiment accessMyMap; + static final int SLOTS = 4; + 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 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/ConcurrentAccessExperiment.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java new file mode 100644 index 0000000000..b1276410ce --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java @@ -0,0 +1,40 @@ +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) { + 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)); + 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 From 407861afac9e1b78ed19206280e3d0f23a7e90b5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 18:18:05 +0100 Subject: [PATCH 16/23] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 45 ++++++++++--------- .../lock/ConcurrentAccessExperiment.java | 20 ++------- .../baeldung/concurrent/lock/StripedLock.java | 7 +-- 3 files changed, 28 insertions(+), 44 deletions(-) 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) { From e09d87a60494ff1f4296fc8c8f11c7ae867d5bf8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 19:56:30 +0100 Subject: [PATCH 17/23] BAEL-3855 --- .../baeldung/concurrent/lock/SingleLock.java | 24 +++++++------- .../baeldung/concurrent/lock/StripedLock.java | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 26 deletions(-) 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 8a3106f650..84a82baff2 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 @@ -14,30 +14,30 @@ public class SingleLock extends ConcurrentAccessExperiment { protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { - boolean done = false; try { - while(!done) { - done = lock.tryLock(); - } + lock.lock(); map.put("key" + key, "value" + key); + } catch (Exception e) { + this.putSupplier(map, key); } finally { - lock.unlock(); - } + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); } protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { - boolean done = false; try { - while(!done) { - done = lock.tryLock(); - } + lock.lock(); map.get("key" + key); + } catch (Exception e) { + this.getSupplier(map, key); } finally { - lock.unlock(); - } + try { + lock.unlock(); + } catch (Exception e) {} } 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 77bf2de7c0..ac94de6451 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 @@ -7,23 +7,25 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; public class StripedLock extends ConcurrentAccessExperiment { - Striped lock; + Striped stripedLock; public StripedLock(int buckets) { - lock = Striped.lock(buckets); + stripedLock = Striped.lock(buckets); } protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { - Lock currentLock = lock.get("key" + key); - boolean done = false; + int bucket = key % stripedLock.size(); + Lock lock = stripedLock.get(bucket); try { - while(!done) { - done = currentLock.tryLock(); - } + lock.tryLock(); map.put("key" + key, "value" + key); + } catch (Exception e) { + this.putSupplier(map, key); } finally { - currentLock.unlock(); + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); @@ -31,15 +33,17 @@ public class StripedLock extends ConcurrentAccessExperiment { protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { - Lock currentLock = lock.get("key" + key); - boolean done = false; + int bucket = key % stripedLock.size(); + Lock lock = stripedLock.get(bucket); try { - while(!done) { - done = currentLock.tryLock(); - } + lock.tryLock(); map.get("key" + key); + } catch (Exception e) { + this.getSupplier(map, key); } finally { - currentLock.unlock(); + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); From e501b2092f1b6872dd9f483800d5e8f9d3148c72 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 20:09:14 +0100 Subject: [PATCH 18/23] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 4 ++-- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 84a82baff2..43c6c3e747 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 @@ -12,7 +12,7 @@ public class SingleLock extends ConcurrentAccessExperiment { lock = new ReentrantLock(); } - protected synchronized Supplier putSupplier(Map map, int key) { + protected Supplier putSupplier(Map map, int key) { return (()-> { try { lock.lock(); @@ -27,7 +27,7 @@ public class SingleLock extends ConcurrentAccessExperiment { }); } - protected synchronized Supplier getSupplier(Map map, int key) { + protected Supplier getSupplier(Map map, int key) { return (()-> { try { lock.lock(); 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 ac94de6451..8b661ecedc 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 @@ -13,7 +13,7 @@ public class StripedLock extends ConcurrentAccessExperiment { stripedLock = Striped.lock(buckets); } - protected synchronized Supplier putSupplier(Map map, int key) { + protected Supplier putSupplier(Map map, int key) { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); @@ -31,7 +31,7 @@ public class StripedLock extends ConcurrentAccessExperiment { }); } - protected synchronized Supplier getSupplier(Map map, int key) { + protected Supplier getSupplier(Map map, int key) { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); From 880f922df3c4ae9cad08fd3ccb1c1d6f701fbabc Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 20:13:12 +0100 Subject: [PATCH 19/23] BAEL-3855 identation --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 43c6c3e747..9bbac82c6d 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 @@ -22,7 +22,8 @@ public class SingleLock extends ConcurrentAccessExperiment { } finally { try { lock.unlock(); - } catch (Exception e) {} } + } catch (Exception e) {} + } return null; }); } @@ -37,7 +38,8 @@ public class SingleLock extends ConcurrentAccessExperiment { } finally { try { lock.unlock(); - } catch (Exception e) {} } + } catch (Exception e) {} + } return null; }); } From 0e3a4221fe622b572358ea8a656082f59f190f48 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 13 Mar 2020 16:33:34 +0100 Subject: [PATCH 20/23] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 21 ++++++++++--------- .../baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) 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 4dfbd8ea18..2dcaa5cb53 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 @@ -3,6 +3,7 @@ package com.baeldung.concurrent.lock; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.Map; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -25,28 +26,28 @@ public class ConcurrentAccessBenchmark { @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void singleLockHashMap() throws InterruptedException { - (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); + public Map singleLockHashMap() throws InterruptedException { + return (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void stripedLockHashMap() throws InterruptedException { - (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + public Map stripedLockHashMap() throws InterruptedException { + return (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); + public Map singleLockConcurrentHashMap() throws InterruptedException { + return (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); + public Map stripedLockConcurrentHashMap() throws InterruptedException { + return (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/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index 8b661ecedc..46610c3b78 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 @@ -15,7 +15,7 @@ public class StripedLock extends ConcurrentAccessExperiment { protected Supplier putSupplier(Map map, int key) { return (()-> { - int bucket = key % stripedLock.size(); + int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { lock.tryLock(); @@ -33,7 +33,7 @@ public class StripedLock extends ConcurrentAccessExperiment { protected Supplier getSupplier(Map map, int key) { return (()-> { - int bucket = key % stripedLock.size(); + int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { lock.tryLock(); From 5065a7353dd2d4856c4bf8997d511a7c3ce6f650 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 15 Mar 2020 12:50:43 +0100 Subject: [PATCH 21/23] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 11 ++++++----- .../com/baeldung/concurrent/lock/SingleLock.java | 12 ++---------- .../baeldung/concurrent/lock/StripedLock.java | 16 ++++------------ 3 files changed, 12 insertions(+), 27 deletions(-) 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 2dcaa5cb53..ceb53ce077 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 @@ -18,36 +18,37 @@ import org.openjdk.jmh.annotations.Warmup; @Fork(value = 2) @Warmup(iterations = 0) public class ConcurrentAccessBenchmark { - ConcurrentAccessExperiment accessMyMap; static final int SLOTS = 4; static final int THREADS = 10000; static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + SingleLock singleLock = new SingleLock(); + StripedLock stripedLock = new StripedLock(BUCKETS); @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockHashMap() throws InterruptedException { - return (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); + return singleLock.doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockHashMap() throws InterruptedException { - return (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + return stripedLock.doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockConcurrentHashMap() throws InterruptedException { - return (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return singleLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockConcurrentHashMap() throws InterruptedException { - return (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return stripedLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); } } 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 9bbac82c6d..762053c4c9 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 @@ -17,12 +17,8 @@ public class SingleLock extends ConcurrentAccessExperiment { try { lock.lock(); map.put("key" + key, "value" + key); - } catch (Exception e) { - this.putSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); @@ -33,12 +29,8 @@ public class SingleLock extends ConcurrentAccessExperiment { try { lock.lock(); map.get("key" + key); - } catch (Exception e) { - this.getSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + 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 46610c3b78..e132cb061d 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 @@ -18,14 +18,10 @@ public class StripedLock extends ConcurrentAccessExperiment { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { - lock.tryLock(); + lock.lock(); map.put("key" + key, "value" + key); - } catch (Exception e) { - this.putSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); @@ -36,14 +32,10 @@ public class StripedLock extends ConcurrentAccessExperiment { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { - lock.tryLock(); + lock.lock(); map.get("key" + key); - } catch (Exception e) { - this.getSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); From dae03d6a87137322cf5f5a67d8a33e86dfbbf7f4 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 15 Mar 2020 13:04:55 +0100 Subject: [PATCH 22/23] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 6 ++---- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) 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 762053c4c9..19b3ba4510 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 @@ -16,11 +16,10 @@ public class SingleLock extends ConcurrentAccessExperiment { return (()-> { try { lock.lock(); - map.put("key" + key, "value" + key); + return map.put("key" + key, "value" + key); } finally { lock.unlock(); } - return null; }); } @@ -28,11 +27,10 @@ public class SingleLock extends ConcurrentAccessExperiment { return (()-> { try { lock.lock(); - map.get("key" + key); + return map.get("key" + key); } finally { 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 e132cb061d..7adca428ba 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 @@ -19,11 +19,10 @@ public class StripedLock extends ConcurrentAccessExperiment { Lock lock = stripedLock.get(bucket); try { lock.lock(); - map.put("key" + key, "value" + key); + return map.put("key" + key, "value" + key); } finally { lock.unlock(); } - return null; }); } @@ -33,11 +32,10 @@ public class StripedLock extends ConcurrentAccessExperiment { Lock lock = stripedLock.get(bucket); try { lock.lock(); - map.get("key" + key); + return map.get("key" + key); } finally { lock.unlock(); } - return null; }); } } From 0692bac979c756b7e8a6e9fd95f37a58233e3f05 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 18 Mar 2020 10:18:58 +0100 Subject: [PATCH 23/23] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 4 ++-- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 19b3ba4510..4dff459df6 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 @@ -14,8 +14,8 @@ public class SingleLock extends ConcurrentAccessExperiment { protected Supplier putSupplier(Map map, int key) { return (()-> { + lock.lock(); try { - lock.lock(); return map.put("key" + key, "value" + key); } finally { lock.unlock(); @@ -25,8 +25,8 @@ public class SingleLock extends ConcurrentAccessExperiment { protected Supplier getSupplier(Map map, int key) { return (()-> { + lock.lock(); try { - lock.lock(); return map.get("key" + key); } finally { lock.unlock(); 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 7adca428ba..47c47d8813 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 @@ -17,8 +17,8 @@ public class StripedLock extends ConcurrentAccessExperiment { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); + lock.lock(); try { - lock.lock(); return map.put("key" + key, "value" + key); } finally { lock.unlock(); @@ -30,8 +30,8 @@ public class StripedLock extends ConcurrentAccessExperiment { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); + lock.lock(); try { - lock.lock(); return map.get("key" + key); } finally { lock.unlock();