From 876d78b188781fd5f3b7d959de091ee35d836771 Mon Sep 17 00:00:00 2001 From: kpentaris Date: Wed, 24 Aug 2022 16:47:46 +0300 Subject: [PATCH] [BAEL-4500] Add locked ownable synchronizers example code (#12608) * Add locked ownable synchronizers example code * refactor application snippet --- .../ownablesynchronizers/Application.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/ownablesynchronizers/Application.java diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/ownablesynchronizers/Application.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/ownablesynchronizers/Application.java new file mode 100644 index 0000000000..d09c59fedc --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/ownablesynchronizers/Application.java @@ -0,0 +1,45 @@ +package com.baeldung.ownablesynchronizers; + +import java.util.concurrent.locks.ReentrantLock; + +public class Application { + + public static Thread createThread(ReentrantLock mainLock, ReentrantLock otherLock, String threadName) { + return new Thread(() -> { + try { + mainLock.lock(); + + // synchronized block here allows us to wait for other thread to lock, + // in order to simulate a deadlock + synchronized (Application.class) { + Application.class.notify(); + if (!otherLock.isLocked()) { + Application.class.wait(); + } + } + + // thread will hang here + otherLock.lock(); + + System.out.println(threadName + ": Finished"); + mainLock.unlock(); + otherLock.unlock(); + } catch (InterruptedException e) { + System.out.println(threadName + ": " + e.getMessage()); + } + }); + } + + public static void main(String[] args) throws Exception { + ReentrantLock firstLock = new ReentrantLock(true); + ReentrantLock secondLock = new ReentrantLock(true); + Thread first = createThread(firstLock, secondLock, "Thread-0"); + Thread second = createThread(secondLock, firstLock, "Thread-1"); + + first.start(); + second.start(); + + first.join(); + second.join(); + } +}