forked from Parallele_Programmierung/Labs
initial
parent
fbb4d157a5
commit
489f0b0207
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Justfile (https://just.systems/) for starting Maven standard targets
|
||||||
|
|
||||||
|
default: clean compile package
|
||||||
|
|
||||||
|
exec class args: compile
|
||||||
|
mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}}
|
||||||
|
# exec class args:
|
||||||
|
# java -cp target/app.jar {{class}} {{args}}
|
||||||
|
clean:
|
||||||
|
mvn clean
|
||||||
|
compile:
|
||||||
|
mvn compile
|
||||||
|
test: compile
|
||||||
|
mvn test
|
||||||
|
javadoc:
|
||||||
|
mvn javadoc:javadoc
|
||||||
|
package:
|
||||||
|
mvn package
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>pp</groupId>
|
||||||
|
<artifactId>pp.07.01.synchronizedWrapper</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.release>10</maven.compiler.release>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency><!-- für Unit-Tests -->
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für Lombok -->
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für net.jcip Annotationen -->
|
||||||
|
<groupId>net.jcip</groupId>
|
||||||
|
<artifactId>jcip-annotations</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin><!-- für Unit-Tests [mvn test] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn compile] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.9.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn exec:java] -->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn javadoc:javadoc] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
<configuration>
|
||||||
|
<show>private</show>
|
||||||
|
<locale>en_US</locale>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SynchWrapper<T> {
|
||||||
|
private final List<T> decorated;
|
||||||
|
|
||||||
|
public static <T> List<T> synchronizedList(List<T> list) {
|
||||||
|
return (List<T>) new SynchWrapper<>(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SynchWrapper(List<T> list) {
|
||||||
|
this.decorated = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Justfile (https://just.systems/) for starting Maven standard targets
|
||||||
|
|
||||||
|
default: clean compile package
|
||||||
|
|
||||||
|
exec class args: compile
|
||||||
|
mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}}
|
||||||
|
# exec class args:
|
||||||
|
# java -cp target/app.jar {{class}} {{args}}
|
||||||
|
clean:
|
||||||
|
mvn clean
|
||||||
|
compile:
|
||||||
|
mvn compile
|
||||||
|
test: compile
|
||||||
|
mvn test
|
||||||
|
javadoc:
|
||||||
|
mvn javadoc:javadoc
|
||||||
|
package:
|
||||||
|
mvn package
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>pp</groupId>
|
||||||
|
<artifactId>pp.07.01.synchronizedWrapper_solution</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.release>10</maven.compiler.release>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency><!-- für Unit-Tests -->
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für Lombok -->
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>edge-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für net.jcip Annotationen -->
|
||||||
|
<groupId>net.jcip</groupId>
|
||||||
|
<artifactId>jcip-annotations</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin><!-- für Unit-Tests [mvn test] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn compile] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.9.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn exec:java] -->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn javadoc:javadoc] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
<configuration>
|
||||||
|
<show>private</show>
|
||||||
|
<locale>en_US</locale>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
public class SynchWrapper<T> implements List<T> {
|
||||||
|
private final List<T> decorated;
|
||||||
|
|
||||||
|
public static <T> List<T> synchronizedList(List<T> list) {
|
||||||
|
return new SynchWrapper<>(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SynchWrapper(List<T> list) {
|
||||||
|
this.decorated = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int size() {
|
||||||
|
return this.decorated.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean isEmpty() {
|
||||||
|
return this.decorated.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean contains(Object o) {
|
||||||
|
return this.decorated.contains(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized Iterator<T> iterator() {
|
||||||
|
return this.decorated.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized Object[] toArray() {
|
||||||
|
return this.decorated.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized <T> T[] toArray(T[] a) {
|
||||||
|
return this.decorated.toArray(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean add(T e) {
|
||||||
|
return this.decorated.add(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean remove(Object o) {
|
||||||
|
return this.decorated.remove(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean containsAll(Collection<?> c) {
|
||||||
|
return this.decorated.containsAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean addAll(Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean addAll(int index, Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(index, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean removeAll(Collection<?> c) {
|
||||||
|
return this.decorated.removeAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized boolean retainAll(Collection<?> c) {
|
||||||
|
return this.decorated.retainAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void clear() {
|
||||||
|
this.decorated.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized T get(int index) {
|
||||||
|
return this.decorated.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized T set(int index, T element) {
|
||||||
|
return this.decorated.set(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void add(int index, T element) {
|
||||||
|
this.decorated.add(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized T remove(int index) {
|
||||||
|
return this.decorated.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int indexOf(Object o) {
|
||||||
|
return this.decorated.indexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int lastIndexOf(Object o) {
|
||||||
|
return this.decorated.lastIndexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized ListIterator<T> listIterator() {
|
||||||
|
return this.decorated.listIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized ListIterator<T> listIterator(int index) {
|
||||||
|
return this.decorated.listIterator(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized List<T> subList(int fromIndex, int toIndex) {
|
||||||
|
return this.decorated.subList(fromIndex, toIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,159 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
|
||||||
|
import lombok.Synchronized;
|
||||||
|
|
||||||
|
public class SynchWrapperLombok<T> implements List<T> {
|
||||||
|
private final List<T> decorated;
|
||||||
|
|
||||||
|
public static <T> List<T> synchronizedList(List<T> list) {
|
||||||
|
return new SynchWrapperLombok<>(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SynchWrapperLombok(List<T> list) {
|
||||||
|
this.decorated = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public int size() {
|
||||||
|
return this.decorated.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.decorated.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean contains(Object o) {
|
||||||
|
return this.decorated.contains(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public Iterator<T> iterator() {
|
||||||
|
return this.decorated.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public Object[] toArray() {
|
||||||
|
return this.decorated.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public <T> T[] toArray(T[] a) {
|
||||||
|
return this.decorated.toArray(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean add(T e) {
|
||||||
|
return this.decorated.add(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean remove(Object o) {
|
||||||
|
return this.decorated.remove(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean containsAll(Collection<?> c) {
|
||||||
|
return this.decorated.containsAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean addAll(Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean addAll(int index, Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(index, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean removeAll(Collection<?> c) {
|
||||||
|
return this.decorated.removeAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public boolean retainAll(Collection<?> c) {
|
||||||
|
return this.decorated.retainAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public void clear() {
|
||||||
|
this.decorated.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public T get(int index) {
|
||||||
|
return this.decorated.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public T set(int index, T element) {
|
||||||
|
return this.decorated.set(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public void add(int index, T element) {
|
||||||
|
this.decorated.add(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public T remove(int index) {
|
||||||
|
return this.decorated.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public int indexOf(Object o) {
|
||||||
|
return this.decorated.indexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public int lastIndexOf(Object o) {
|
||||||
|
return this.decorated.lastIndexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public ListIterator<T> listIterator() {
|
||||||
|
return this.decorated.listIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public ListIterator<T> listIterator(int index) {
|
||||||
|
return this.decorated.listIterator(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Synchronized
|
||||||
|
public List<T> subList(int fromIndex, int toIndex) {
|
||||||
|
return this.decorated.subList(fromIndex, toIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,258 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
public class SynchWrapperRW<T> implements List<T> {
|
||||||
|
private final List<T> decorated;
|
||||||
|
private final ReadWriteLock lock;
|
||||||
|
private final Lock rLock;
|
||||||
|
private final Lock wLock;
|
||||||
|
|
||||||
|
public static <T> List<T> synchronizedList(List<T> list) {
|
||||||
|
return new SynchWrapperRW<>(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SynchWrapperRW(List<T> list) {
|
||||||
|
this.decorated = list;
|
||||||
|
this.lock = new ReentrantReadWriteLock();
|
||||||
|
this.rLock = this.lock.readLock();
|
||||||
|
this.wLock = this.lock.writeLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.size();
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.isEmpty();
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(Object o) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.contains(o);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<T> iterator() {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.iterator();
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] toArray() {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.toArray();
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T[] toArray(T[] a) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.toArray(a);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean add(T e) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.add(e);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean remove(Object o) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.remove(o);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsAll(Collection<?> c) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.containsAll(c);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAll(Collection<? extends T> c) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.addAll(c);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAll(int index, Collection<? extends T> c) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.addAll(index, c);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removeAll(Collection<?> c) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.removeAll(c);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean retainAll(Collection<?> c) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.retainAll(c);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear() {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
this.decorated.clear();
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T get(int index) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.get(index);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T set(int index, T element) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.set(index, element);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int index, T element) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
this.decorated.add(index, element);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T remove(int index) {
|
||||||
|
this.wLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.remove(index);
|
||||||
|
} finally {
|
||||||
|
this.wLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int indexOf(Object o) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.indexOf(o);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int lastIndexOf(Object o) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.lastIndexOf(o);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ListIterator<T> listIterator() {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.listIterator();
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ListIterator<T> listIterator(int index) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.listIterator(index);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<T> subList(int fromIndex, int toIndex) {
|
||||||
|
this.rLock.lock();
|
||||||
|
try {
|
||||||
|
return this.decorated.subList(fromIndex, toIndex);
|
||||||
|
} finally {
|
||||||
|
this.rLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,162 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
import lombok.Locked;
|
||||||
|
|
||||||
|
public class SynchWrapperRWLombok<T> implements List<T> {
|
||||||
|
private final List<T> decorated;
|
||||||
|
|
||||||
|
public static <T> List<T> synchronizedList(List<T> list) {
|
||||||
|
return new SynchWrapperRWLombok<>(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SynchWrapperRWLombok(List<T> list) {
|
||||||
|
this.decorated = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public int size() {
|
||||||
|
return this.decorated.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.decorated.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public boolean contains(Object o) {
|
||||||
|
return this.decorated.contains(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public Iterator<T> iterator() {
|
||||||
|
return this.decorated.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public Object[] toArray() {
|
||||||
|
return this.decorated.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public <T> T[] toArray(T[] a) {
|
||||||
|
return this.decorated.toArray(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean add(T e) {
|
||||||
|
return this.decorated.add(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean remove(Object o) {
|
||||||
|
return this.decorated.remove(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public boolean containsAll(Collection<?> c) {
|
||||||
|
return this.decorated.containsAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean addAll(Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean addAll(int index, Collection<? extends T> c) {
|
||||||
|
return this.decorated.addAll(index, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean removeAll(Collection<?> c) {
|
||||||
|
return this.decorated.removeAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public boolean retainAll(Collection<?> c) {
|
||||||
|
return this.decorated.retainAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public void clear() {
|
||||||
|
this.decorated.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public T get(int index) {
|
||||||
|
return this.decorated.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public T set(int index, T element) {
|
||||||
|
return this.decorated.set(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public void add(int index, T element) {
|
||||||
|
this.decorated.add(index, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Write
|
||||||
|
public T remove(int index) {
|
||||||
|
return this.decorated.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public int indexOf(Object o) {
|
||||||
|
return this.decorated.indexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public int lastIndexOf(Object o) {
|
||||||
|
return this.decorated.lastIndexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public ListIterator<T> listIterator() {
|
||||||
|
return this.decorated.listIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public ListIterator<T> listIterator(int index) {
|
||||||
|
return this.decorated.listIterator(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Locked.Read
|
||||||
|
public List<T> subList(int fromIndex, int toIndex) {
|
||||||
|
return this.decorated.subList(fromIndex, toIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class Tests {
|
||||||
|
private final static int SIZE = 10000;
|
||||||
|
|
||||||
|
static void testAdd(List<Integer> l) {
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < SIZE; i++) {
|
||||||
|
l.add(Integer.valueOf(i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < SIZE; i++) {
|
||||||
|
l.add(Integer.valueOf(i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
try {
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
assertEquals(l.size(), SIZE * 2);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
fail("Interrupt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWrappedListSynchronizedAdd() {
|
||||||
|
testAdd(SynchWrapper.synchronizedList(new ArrayList<Integer>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWrappedListReadWriteLockAdd() {
|
||||||
|
testAdd(SynchWrapperRW.synchronizedList(new ArrayList<Integer>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWrappedListLombokLockAdd() {
|
||||||
|
testAdd(SynchWrapperLombok.synchronizedList(new ArrayList<Integer>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWrappedListReadWriteiLombokLockAdd() {
|
||||||
|
testAdd(SynchWrapperRWLombok.synchronizedList(new ArrayList<Integer>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Justfile (https://just.systems/) for starting Maven standard targets
|
||||||
|
|
||||||
|
default: clean compile package
|
||||||
|
|
||||||
|
exec class args: compile
|
||||||
|
mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}}
|
||||||
|
# exec class args:
|
||||||
|
# java -cp target/app.jar {{class}} {{args}}
|
||||||
|
clean:
|
||||||
|
mvn clean
|
||||||
|
compile:
|
||||||
|
mvn compile
|
||||||
|
test: compile
|
||||||
|
mvn test
|
||||||
|
javadoc:
|
||||||
|
mvn javadoc:javadoc
|
||||||
|
package:
|
||||||
|
mvn package
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>pp</groupId>
|
||||||
|
<artifactId>pp.07.02.Collections</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.release>10</maven.compiler.release>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency><!-- für Unit-Tests -->
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für Lombok -->
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für net.jcip Annotationen -->
|
||||||
|
<groupId>net.jcip</groupId>
|
||||||
|
<artifactId>jcip-annotations</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin><!-- für Unit-Tests [mvn test] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn compile] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.9.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn exec:java] -->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn javadoc:javadoc] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
<configuration>
|
||||||
|
<show>private</show>
|
||||||
|
<locale>en_US</locale>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
class ExperimentVector {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
Vector<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = new Vector<>();
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "Vector");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Justfile (https://just.systems/) for starting Maven standard targets
|
||||||
|
|
||||||
|
default: clean compile package
|
||||||
|
|
||||||
|
exec class args: compile
|
||||||
|
mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}}
|
||||||
|
# exec class args:
|
||||||
|
# java -cp target/app.jar {{class}} {{args}}
|
||||||
|
clean:
|
||||||
|
mvn clean
|
||||||
|
compile:
|
||||||
|
mvn compile
|
||||||
|
test: compile
|
||||||
|
mvn test
|
||||||
|
javadoc:
|
||||||
|
mvn javadoc:javadoc
|
||||||
|
package:
|
||||||
|
mvn package
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>pp</groupId>
|
||||||
|
<artifactId>pp.07.02.Collections_solution</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.release>10</maven.compiler.release>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency><!-- für Unit-Tests -->
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für Lombok -->
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency><!-- für net.jcip Annotationen -->
|
||||||
|
<groupId>net.jcip</groupId>
|
||||||
|
<artifactId>jcip-annotations</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin><!-- für Unit-Tests [mvn test] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn compile] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.9.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn exec:java] -->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin><!-- [mvn javadoc:javadoc] -->
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
<configuration>
|
||||||
|
<show>private</show>
|
||||||
|
<locale>en_US</locale>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class ExperimentArrayList {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
List<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = new ArrayList<>();
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "ArrayList");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class ExperimentLinkedList {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
List<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = new LinkedList<>();
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
synchronized (this.list) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "LinkedList");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class ExperimentSynchedArrayList {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
List<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "SynchedArrayList");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class ExperimentSynchedLinkedList {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
List<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = Collections.synchronizedList(new LinkedList<>());
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "SynchedLinkedList");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class ExperimentSynchedLinkedListRO {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
List<Integer> list;
|
||||||
|
List<Integer> listSynch;
|
||||||
|
List<Integer> listRO;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = new LinkedList<>();
|
||||||
|
this.listSynch = Collections.synchronizedList(this.list);
|
||||||
|
this.listRO = Collections.unmodifiableList(this.list);
|
||||||
|
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.listSynch.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.listSynch.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
this.countA += this.listRO.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
this.countB += this.listRO.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "SynchedLinkedListRO");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
class ExperimentVector {
|
||||||
|
Integer countA;
|
||||||
|
Integer countB;
|
||||||
|
Vector<Integer> list;
|
||||||
|
|
||||||
|
void work(int size) throws InterruptedException {
|
||||||
|
this.countA = 0;
|
||||||
|
this.countB = 0;
|
||||||
|
this.list = new Vector<>();
|
||||||
|
var t1 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t2 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
this.list.add(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t3 = new Thread(() -> {
|
||||||
|
for (var i = 0; i < (size * 2); i++) {
|
||||||
|
this.countA += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var t4 = new Thread(() -> {
|
||||||
|
for (var i = (size * 2) - 1; i >= 0; i--) {
|
||||||
|
this.countB += this.list.get(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var now = System.currentTimeMillis();
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
t3.start();
|
||||||
|
t4.start();
|
||||||
|
t3.join();
|
||||||
|
t4.join();
|
||||||
|
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
|
||||||
|
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
|
||||||
|
System.currentTimeMillis() - now, "Vector");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package pp;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String... args) throws InterruptedException {
|
||||||
|
for (var i = 100; i <= 100000; i *= 10) {
|
||||||
|
(new ExperimentVector()).work(i);
|
||||||
|
(new ExperimentArrayList()).work(i);
|
||||||
|
(new ExperimentLinkedList()).work(i);
|
||||||
|
(new ExperimentSynchedArrayList()).work(i);
|
||||||
|
(new ExperimentSynchedLinkedList()).work(i);
|
||||||
|
(new ExperimentSynchedLinkedListRO()).work(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue