Thread.sleep()).Thread-KlasseThread-Klasse:public class MyThread extends Thread {
public void run() {
// Code für den Thread
}
}
MyThread myThread = new MyThread();
myThread.start();
Runnable-InterfacesRunnable-Interfaces:public class MyRunnable implements Runnable {
public void run() {
// Code für den Thread
}
}
MyRunnable myRunnable = new MyRunnable();
Thread myThread = new Thread(myRunnable);
myThread.start();
Thread myThread = new Thread(new Runnable() {
public void run() {
// Code für den Thread
}
});
myThread.start();
Thread myThread = new Thread(() -> {
// Code für den Thread
});
myThread.start();
class Counter {
private int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
Counter counter = new Counter();
// Thread 1 und Thread 2 erhöhen den Zähler
Thread t1 = new Thread(() -> {
for(int i = 0; i < 10000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for(int i = 0; i < 10000; i++) {
counter.increment();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Erwartetes Ergebnis: 20000");
System.out.println("Tatsächliches Ergebnis: " + counter.getCount());
$ java deadlocks.simple.Counter
Erwartetes Ergebnis: 20000
Tatsächliches Ergebnis: 14966
$Synchronisation in Java mit synchronized (Monitoren):
synchronized-Schlüsselwort: Schützt einen kritischen Abschnitt vor
gleichzeitigen Zugriffen durch mehrere Threads.synchronized-Methoden: Methoden können als synchronized deklariert
werden, um den gesamten Methodenblock zu schützen.synchronized-Blöcke: Einzelne Codeblöcke können mit synchronized
geschützt werden.wait() und notify(): Methoden zum Warten und Benachrichtigen von
Threads in Java.class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
AtomicInteger: Eine atomare Variable, die Operationen wie increment()
und decrement() atomar ausführt.import java.util.concurrent.atomic.AtomicInteger;
class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
public class DeadlockDemo {
private static Object Resource1 = new Object();
private static Object Resource2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (Resource1) {
System.out.println("Thread 1: Ressource 1 gesperrt");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (Resource2) {
System.out.println("Thread 1: Ressource 2 gesperrt");
}
}
});
Thread t2 = new Thread(() -> {
synchronized (Resource2) {
System.out.println("Thread 2: Ressource 2 gesperrt");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (Resource1) {
System.out.println("Thread 2: Ressource 1 gesperrt");
}
}
});
t1.start();
t2.start();
}
}
public class DeadlockDemo {
private static Object Resource1 = new Object();
private static Object Resource2 = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (Resource1) {
System.out.println("Thread 1: Ressource 1 gesperrt");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (Resource2) {
System.out.println("Thread 1: Ressource 2 gesperrt");
}
}
});
Thread t2 = new Thread(() -> {
synchronized (Resource1) {
System.out.println("Thread 2: Ressource 1 gesperrt");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (Resource2) {
System.out.println("Thread 2: Ressource 2 gesperrt");
}
}
});
t1.start();
t2.start();
}
}
-> Live Demo mit Java-Code
Thread.NORM_PRIORITY (5).setPriority() festgelegt werden.wait() und notify() in Javawait(): Lässt den aktuellen Thread warten, bis er benachrichtigt (notify()) oder unterbrochen wird.notify(): Weckt einen wartenden Thread auf, sodass er fortgesetzt werden kann.notifyAll(): Weckt alle wartenden Threads auf.Beide Methoden gehören zur Klasse Object und müssen innerhalb eines synchronized-Blocks aufgerufen werden.
Andernfalls gibt es eine IllegalMonitorStateException.
wait() - warten auf eine Bedingungsynchronized (monitor) {
while (!condition) {
try {
monitor.wait();
} catch (InterruptedException e) {
// Behandlung der Unterbrechung
}
}
// Aktionscode, wenn Bedingung erfüllt
}
notify() oder notifyAll() oder durch eine Unterbrechung geweckt.notify() - Benachrichtigung eines wartenden Threadssynchronized (monitor) {
condition = true;
monitor.notify();
}
true und benachrichtigt einen wartenden Thread.notifyAll() - Benachrichtigung aller wartenden Threadssynchronized (monitor) {
condition = true;
monitor.notifyAll();
}
true und benachrichtigt alle wartenden Threads.ArrayList, HashMap, HashSet, etc.Collections.synchronizedList(new ArrayList<>()).Vector, Hashtable, ConcurrentHashMap, CopyOnWriteArrayList, etc.