From ae25cc3a83f40f49dbcfced14c48cbf1a2966f4d Mon Sep 17 00:00:00 2001 From: Obai Albek Date: Mon, 19 May 2025 17:04:44 +0200 Subject: [PATCH] =?UTF-8?q?P=C3=9C=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pp.A4-HandOverHandLocking/.gitignore | 3 + pp.A4-HandOverHandLocking/pom.xml | 62 ++++++++++++ .../src/main/java/pp/Main.java | 41 ++++++++ .../src/main/java/pp/SimplifiedList.java | 56 +++++++++++ .../java/pp/ThreadsafeSimplifiedList.java | 98 +++++++++++++++++++ 5 files changed, 260 insertions(+) create mode 100644 pp.A4-HandOverHandLocking/.gitignore create mode 100644 pp.A4-HandOverHandLocking/pom.xml create mode 100644 pp.A4-HandOverHandLocking/src/main/java/pp/Main.java create mode 100644 pp.A4-HandOverHandLocking/src/main/java/pp/SimplifiedList.java create mode 100644 pp.A4-HandOverHandLocking/src/main/java/pp/ThreadsafeSimplifiedList.java diff --git a/pp.A4-HandOverHandLocking/.gitignore b/pp.A4-HandOverHandLocking/.gitignore new file mode 100644 index 0000000..525681c --- /dev/null +++ b/pp.A4-HandOverHandLocking/.gitignore @@ -0,0 +1,3 @@ +/target/ +/.classpath +/.project diff --git a/pp.A4-HandOverHandLocking/pom.xml b/pp.A4-HandOverHandLocking/pom.xml new file mode 100644 index 0000000..d4f8887 --- /dev/null +++ b/pp.A4-HandOverHandLocking/pom.xml @@ -0,0 +1,62 @@ + + 4.0.0 + pp + pp.A4-HandOverHandLocking + 1.0-SNAPSHOT + jar + + + pp.Main + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + clean compile exec:java + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + diff --git a/pp.A4-HandOverHandLocking/src/main/java/pp/Main.java b/pp.A4-HandOverHandLocking/src/main/java/pp/Main.java new file mode 100644 index 0000000..48b71a1 --- /dev/null +++ b/pp.A4-HandOverHandLocking/src/main/java/pp/Main.java @@ -0,0 +1,41 @@ +package pp; + +public class Main { + static SimplifiedList list; + + static Runnable sliceSum(int start, int end, int expected) { + return () -> { + var sum = 0; + for (var i = start; i < end; i++) { + sum += list.get(i); + } + if (sum != expected) { + System.out.println("Fehler in " + + Thread.currentThread().getName() + ": " + sum); + } + }; + } + + public static void main(String... args) throws InterruptedException { + list = new ThreadsafeSimplifiedList<>(); + for (int i = 0; i < 5000; i++) { + list.add(i); + } + var thread0 = new Thread(sliceSum(0, 1250, 780625)); + var thread1 = new Thread(sliceSum(1250, 2500, 2343125)); + var thread2 = new Thread(sliceSum(2500, 3750, 3905625)); + var thread3 = new Thread(sliceSum(3750, 5000, 5468125)); + var start = System.currentTimeMillis(); + thread0.start(); + thread1.start(); + thread2.start(); + thread3.start(); + thread0.join(); + thread1.join(); + thread2.join(); + thread3.join(); + System.out.printf("%s: %d ms\n", list.getClass().toString(), + System.currentTimeMillis() - start); + } + +} diff --git a/pp.A4-HandOverHandLocking/src/main/java/pp/SimplifiedList.java b/pp.A4-HandOverHandLocking/src/main/java/pp/SimplifiedList.java new file mode 100644 index 0000000..dd9f1a1 --- /dev/null +++ b/pp.A4-HandOverHandLocking/src/main/java/pp/SimplifiedList.java @@ -0,0 +1,56 @@ +package pp; + +public interface SimplifiedList { + + /** + * Returns the element at the specified position in this list. + * + * @param index index of the element to return + * @return the element at the specified position in this list + */ + public T get(int index); + + /** + * Appends the specified element to the end of this list. There are no + * limitations on what elements may be added to this list. + * + * @param element element to be appended to this list + * @return true + * @see java.util.Collection#add(Object) + * + */ + public boolean add(T element); + + /** + * Replaces the element at the specified position in this list with the + * specified element. + * + * @param index index of the element to replace + * @param element element to be stored at the specified position + * @return the element previously at the specified position + */ + public T set(int index, T element); + + /** + * Returns true if this list contains no elements. + * + * @return true if this list contains no elements + */ + public boolean isEmpty(); + + /** + * delayed passing through of parameter + * + * @param element element to pass through + * @return passed though element + * + */ + public default T delay(T element) { + try { + Thread.sleep(10); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + return element; + } +} diff --git a/pp.A4-HandOverHandLocking/src/main/java/pp/ThreadsafeSimplifiedList.java b/pp.A4-HandOverHandLocking/src/main/java/pp/ThreadsafeSimplifiedList.java new file mode 100644 index 0000000..cd9d9ce --- /dev/null +++ b/pp.A4-HandOverHandLocking/src/main/java/pp/ThreadsafeSimplifiedList.java @@ -0,0 +1,98 @@ +package pp; + +import lombok.Synchronized; +import net.jcip.annotations.ThreadSafe; + +@ThreadSafe +public class ThreadsafeSimplifiedList implements SimplifiedList { + private Node first; + + private class Node { + private U element; + private Node prev; + private Node next; + + private Node(U element, Node prev, Node next) { + super(); + this.element = element; + this.prev = prev; + this.next = next; + } + } + + public ThreadsafeSimplifiedList() { + super(); + this.first = null; + } + + /** + * Returns the element at the specified position in this list. + * + * @param index index of the element to return + * @return the element at the specified position in this list + */ + @Override + @Synchronized + public T get(int index) { + var ptr = this.first; + for (var j = 0; j < index; j++) { + ptr = ptr.next; + } + return delay(ptr.element); + } + + /** + * Appends the specified element to the end of this list. There are no + * limitations on what elements may be added to this list. + * + * @param element element to be appended to this list + * @return true + * @see java.util.Collection#add(Object) + * + */ + @Override + @Synchronized + public boolean add(T element) { + if (this.first != null) { + var ptr = this.first; + while (ptr.next != null) { + ptr = ptr.next; + } + ptr.next = new Node<>(element, ptr, null); + } else { + this.first = new Node<>(element, null, null); + } + return true; + } + + /** + * Replaces the element at the specified position in this list with the + * specified element. + * + * @param index index of the element to replace + * @param element element to be stored at the specified position + * @return the element previously at the specified position + */ + @Override + @Synchronized + public T set(int index, T element) { + var ptr = this.first; + for (var j = 0; j < index; j++) { + ptr = ptr.next; + } + var prevElement = ptr.element; + ptr.element = element; + return prevElement; + } + + /** + * Returns true if this list contains no elements. + * + * @return true if this list contains no elements + */ + @Override + @Synchronized + public boolean isEmpty() { + return this.first == null; + } +}