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.