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;
+ }
+}