diff --git a/src/main/java/workshop/exercises/DeadlockPreventionWorkshop.java b/src/main/java/workshop/exercises/DeadlockPreventionWorkshop.java index 91ba6a8..c179621 100644 --- a/src/main/java/workshop/exercises/DeadlockPreventionWorkshop.java +++ b/src/main/java/workshop/exercises/DeadlockPreventionWorkshop.java @@ -22,7 +22,9 @@ public class DeadlockPreventionWorkshop { public static void useResources(Resource r1, Resource r2) { // TODO: Prevent deadlock by enforcing a consistent lock acquisition order // Hint: Compare resource IDs and always synchronize on the resource with the smaller ID first. - + Resource firstLock = r1.getId() < r2.getId() ? r1 : r2; + Resource secondLock = r1.getId() < r2.getId() ? r2 : r1; + System.out.println(Thread.currentThread().getName() + " is attempting to lock " + r1.getName()); synchronized (r1) { System.out.println("+ " + Thread.currentThread().getName() + " locked " + r1.getName()); diff --git a/src/main/java/workshop/exercises/LockWorkshop.java b/src/main/java/workshop/exercises/LockWorkshop.java index ec24ecf..f035dd5 100644 --- a/src/main/java/workshop/exercises/LockWorkshop.java +++ b/src/main/java/workshop/exercises/LockWorkshop.java @@ -7,6 +7,7 @@ public class LockWorkshop { public static int counter = 0; // TODO: Create a ReentrantLock instance to protect the critical section + private static final Lock lock = new ReentrantLock(); public static class MyRunnable implements Runnable { @Override @@ -14,7 +15,13 @@ public class LockWorkshop { int i; for (i = 0; i < 1_000_000; i++) { // TODO: Acquire the lock, increment the counter, and release the lock safely in a finally block - counter += 1; + lock.lock(); + try { + counter += 1; + } + finally { + lock.unlock(); + } } System.out.println("Increments completed by " + Thread.currentThread().getName() + ": " + i); } diff --git a/src/main/java/workshop/exercises/SynchronizedWorkshop.java b/src/main/java/workshop/exercises/SynchronizedWorkshop.java index 9259d8e..1bd345c 100644 --- a/src/main/java/workshop/exercises/SynchronizedWorkshop.java +++ b/src/main/java/workshop/exercises/SynchronizedWorkshop.java @@ -4,6 +4,7 @@ public class SynchronizedWorkshop { public static int counter = 0; // TODO: Define a lock object to prevent race condition + private static final Object lockObject = new Object(); public static class MyRunnable implements Runnable { @Override @@ -11,7 +12,9 @@ public class SynchronizedWorkshop { int i; for (i = 0; i < 1_000_000; i++) { // TODO: Use a synchronized block to protect the counter increment - counter += 1; + synchronized (lockObject){ + counter += 1; + } } System.out.println("Increments completed by " + Thread.currentThread().getName() + ": " + i); } diff --git a/src/main/java/workshop/exercises/TaylorSeries.java b/src/main/java/workshop/exercises/TaylorSeries.java index d63a18e..c463bec 100644 --- a/src/main/java/workshop/exercises/TaylorSeries.java +++ b/src/main/java/workshop/exercises/TaylorSeries.java @@ -24,11 +24,27 @@ public class TaylorSeries { // TODO: Calculate the n-th term of the Taylor series for sin(x): // term = (-1)^n * (x^(2n+1)) / (2n+1)! // Add the term to the global sum ensuring thread-safety. + int power = 2 * n + 1; + BigDecimal num = x.pow(power, mc); + BigDecimal den = factorial(power); + BigDecimal term = num.divide(den, mc); + + if (n % 2 != 0){ + term = term.negate(); + } + + synchronized (TaylorSeries.class){ + sum = sum.add(term, mc); + } } // TODO: Implement factorial(k) using BigDecimal private BigDecimal factorial(int k) { - return BigDecimal.ZERO; + BigDecimal result = BigDecimal.ONE; + for (int i = 2; i <= k; i++) { + result = result.multiply(new BigDecimal(i), mc); + } + return result; } } @@ -42,6 +58,7 @@ public class TaylorSeries { // Submit tasks to calculate terms for (int i = 0; i < 100; i++) { // TODO: Submit task to the thread pool + threadPool.submit(new CalculateSin(x, i)); } threadPool.shutdown(); diff --git a/structure.txt b/structure.txt new file mode 100644 index 0000000..653ea7d Binary files /dev/null and b/structure.txt differ