|
1 | | -# jv-homework-template |
| 1 | +# Decrease counter |
| 2 | + |
| 3 | +We wrote multi-threaded code that decreases the value of the `Counter` object. |
| 4 | +In `main()` method, 20 threads are created that accept the same `Counter` object. |
| 5 | +The task of each thread is to decrease the value of the `counter` by 1. |
| 6 | + |
| 7 | +The original `counter` value is 20, so we should expect 0 in the end. |
| 8 | + |
| 9 | +We are logging the value before and after each decrement, and now we see that the results are hardly consistent. |
| 10 | + |
| 11 | +``` |
| 12 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 15, counter value 20 |
| 13 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 8, counter value 20 |
| 14 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 12, counter value 20 |
| 15 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 18, counter value 20 |
| 16 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 14, counter value 20 |
| 17 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 5, counter value 20 |
| 18 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 7, counter value 20 |
| 19 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 9, counter value 20 |
| 20 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 11, counter value 20 |
| 21 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 3, counter value 20 |
| 22 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 6, counter value 20 |
| 23 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 17, counter value 20 |
| 24 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 2, counter value 20 |
| 25 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 10, counter value 20 |
| 26 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 19, counter value 20 |
| 27 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 20, counter value 20 |
| 28 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 16, counter value 20 |
| 29 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 13, counter value 20 |
| 30 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 7, counter value 12 |
| 31 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 1, counter value 20 |
| 32 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 3, counter value 16 |
| 33 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 20, counter value 10 |
| 34 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 19, counter value 9 |
| 35 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 5, counter value 17 |
| 36 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 2, counter value 12 |
| 37 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 8, counter value 18 |
| 38 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 9, counter value 18 |
| 39 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 14, counter value 15 |
| 40 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 10, counter value 14 |
| 41 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 17, counter value 11 |
| 42 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 16, counter value 8 |
| 43 | +INFO core.basesyntax.Counter:16 Before decrementing, Thread # 4, counter value 20 |
| 44 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 11, counter value 18 |
| 45 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 12, counter value 5 |
| 46 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 6, counter value 6 |
| 47 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 13, counter value 7 |
| 48 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 18, counter value 4 |
| 49 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 4, counter value 3 |
| 50 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 15, counter value 2 |
| 51 | +INFO core.basesyntax.Counter:19 After decrementing, Thread # 1, counter value 1 |
| 52 | +``` |
| 53 | + |
| 54 | +As we see, all threads are accessing the same value of the variable at the same time, |
| 55 | +then they also decrease it randomly, and we can even get 1 instead of 0 in the end of execution. |
| 56 | + |
| 57 | +Fix the solution to remove the race condition between the threads. |
| 58 | +Each thread should take the value that was decremented by the previous thread, and the logs should be consistent. |
| 59 | +Let's allow only one thread to execute the meaningful part of code at a time. |
| 60 | + |
| 61 | +Note that you should push the file with logs to your PR, so please, do not add it to `.gitignore`. |
| 62 | +You may probably need to use the absolute path to the log file in `log4j2.xml`. |
0 commit comments