From 5849ca5c05437aa8c4e4387900a6d1bc6de1394f Mon Sep 17 00:00:00 2001 From: Vlad Andriichuk Date: Tue, 23 Dec 2025 12:51:43 +0100 Subject: [PATCH] Resolved problem of race condition in Counter using keyword synchronized in method decreaseValue() and logged data into file logs/app.log --- logs/app.log | 40 ++++++++++++++++++++++ src/main/java/core/basesyntax/Counter.java | 13 ++++--- 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 logs/app.log diff --git a/logs/app.log b/logs/app.log new file mode 100644 index 00000000..92554968 --- /dev/null +++ b/logs/app.log @@ -0,0 +1,40 @@ +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 2, counter value 20 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 2, counter value 19 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 19, counter value 19 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 19, counter value 18 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 20, counter value 18 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 20, counter value 17 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 18, counter value 17 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 18, counter value 16 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 17, counter value 16 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 17, counter value 15 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 16, counter value 15 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 16, counter value 14 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 15, counter value 14 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 15, counter value 13 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 14, counter value 13 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 14, counter value 12 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 13, counter value 12 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 13, counter value 11 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 12, counter value 11 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 12, counter value 10 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 11, counter value 10 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 11, counter value 9 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 10, counter value 9 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 10, counter value 8 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 9, counter value 8 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 9, counter value 7 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 8, counter value 7 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 8, counter value 6 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 7, counter value 6 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 7, counter value 5 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 6, counter value 5 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 6, counter value 4 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 5, counter value 4 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 5, counter value 3 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 4, counter value 3 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 4, counter value 2 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 3, counter value 2 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 3, counter value 1 +INFO core.basesyntax.Counter:18 Before decrementing, Thread # 1, counter value 1 +INFO core.basesyntax.Counter:21 After decrementing, Thread # 1, counter value 0 diff --git a/src/main/java/core/basesyntax/Counter.java b/src/main/java/core/basesyntax/Counter.java index 4af46bd4..ef9cfb02 100644 --- a/src/main/java/core/basesyntax/Counter.java +++ b/src/main/java/core/basesyntax/Counter.java @@ -6,6 +6,7 @@ public class Counter { private static final Logger logger = LogManager.getLogger(Counter.class); private static final String MESSAGE = "%20s, Thread # %2s, counter value %2d"; + private final Object lock = new Object(); private int value; public Counter(int value) { @@ -13,10 +14,12 @@ public Counter(int value) { } public void decreaseValue() { - logger.info(String.format(MESSAGE, - "Before decrementing", Thread.currentThread().getName(), value)); - value--; - logger.info(String.format(MESSAGE, - "After decrementing", Thread.currentThread().getName(), value)); + synchronized (lock) { + logger.info(String.format(MESSAGE, + "Before decrementing", Thread.currentThread().getName(), value)); + value--; + logger.info(String.format(MESSAGE, + "After decrementing", Thread.currentThread().getName(), value)); + } } }