diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d3ca212
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ pp.hsma
+ pp.A4
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ 11
+ 11
+
+
+
diff --git a/src/main/java/io/dama/ffi/hoh/Main.java b/src/main/java/io/dama/ffi/hoh/Main.java
new file mode 100644
index 0000000..82db479
--- /dev/null
+++ b/src/main/java/io/dama/ffi/hoh/Main.java
@@ -0,0 +1,41 @@
+package io.dama.ffi.hoh;
+
+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/src/main/java/io/dama/ffi/hoh/SimplifiedList.java b/src/main/java/io/dama/ffi/hoh/SimplifiedList.java
new file mode 100644
index 0000000..5fc52c3
--- /dev/null
+++ b/src/main/java/io/dama/ffi/hoh/SimplifiedList.java
@@ -0,0 +1,56 @@
+package io.dama.ffi.hoh;
+
+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/src/main/java/io/dama/ffi/hoh/ThreadsafeSimplifiedList.java b/src/main/java/io/dama/ffi/hoh/ThreadsafeSimplifiedList.java
new file mode 100644
index 0000000..bbc53aa
--- /dev/null
+++ b/src/main/java/io/dama/ffi/hoh/ThreadsafeSimplifiedList.java
@@ -0,0 +1,90 @@
+package io.dama.ffi.hoh;
+
+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
+ public synchronized 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
+ public synchronized 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
+ public synchronized 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
+ public synchronized boolean isEmpty() {
+ return this.first == null;
+ }
+}