Aklıma gelen bir örnek Masa, El Feneri ve Piller senaryosu. Bir el feneri ve bir masanın üstüne yerleştirilmiş bir çift pil düşünün. Bu masaya gidip, başka bir kişi el fenerine sahipken pilleri kaparsanız, ikiniz de eşyalarını masaya ilk önce kimin koyacağını beklerken garip bir şekilde birbirinize bakmaya zorlanacaksınız. Bu bir kilitlenme örneğidir. Siz ve kişi kaynakları bekliyorsunuz ama hiçbiriniz kaynaklarından vazgeçmiyorsunuz.
Benzer şekilde, bir programda, iki veya daha fazla iş parçacığı (siz ve diğer kişi) iki veya daha fazla kilidin (el feneri ve piller) serbest bırakılmasını beklediğinizde ve programdaki koşullar kilitlerin asla serbest kalmayacağı şekilde olduğunda kilitlenme oluşur ( ikiniz de yapbozun bir parçasına sahipsiniz).
Java'yı biliyorsanız, bu sorunu şu şekilde temsil edebilirsiniz:
import java.util.concurrent.locks.*;
public class Deadlock1 {
public static class Table {
private static Lock Flashlight = new ReentrantLock();
private static Lock Batteries = new ReentrantLock();
public static void giveFlashLightAndBatteries() {
try {
Flashlight.lock();
Batteries.lock();
System.out.println("Lights on");
} finally {
Batteries.unlock();
Flashlight.unlock();
}
}
public static void giveBatteriesAndFlashLight() {
try {
Batteries.lock();
Flashlight.lock();
System.out.println("Lights on");
} finally {
Flashlight.unlock();
Batteries.unlock();
}
}
}
public static void main(String[] args) {
// This thread represents person one
new Thread(new Runnable() {
public void run() { Table.giveFlashLightAndBatteries(); }
}).start();
// This thread represents person two
new Thread(new Runnable() {
public void run() { Table.giveBatteriesAndFlashLight(); }
}).start();
}
}
Bu örneği çalıştırırsanız, bazen işlerin iyi ve doğru bir şekilde yürüdüğünü fark edeceksiniz. Ancak bazen programınız hiçbir şey yazdırmaz. Bunun nedeni, bir kişinin pilleri varken, diğerinin el fenerinin el fenerini açıp kilitlenmeye neden olmasını önleyen el feneri olmasıdır.
Bu örnek, java öğreticilerinde verilen örneğe benzer: http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Başka bir örnek de döngü örneğidir:
public class Deadlock2 {
public static class Loop {
private static boolean done = false;
public static synchronized void startLoop() throws InterruptedException {
while(!done) {
Thread.sleep(1000);
System.out.println("Not done");
}
}
public static synchronized void stopLoop() {
done = true;
}
}
public static void main(String[] args) {
// This thread starts the loop
new Thread(new Runnable() {
public void run() {
try {
Loop.startLoop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// This thread stops the loop
new Thread(new Runnable() {
public void run() {
Loop.stopLoop();
}
}).start();
}
}
Bu örnek ya tekrar tekrar 'Bitmedi' yazabilir ya da asla 'Bitmedi' yazdıramaz. Birincisi, birinci iş parçacığının sınıf kilidini alması ve ikinci iş parçacığı tarafından 'stopLoop'a erişilmesini engelleyerek onu asla bırakmaması nedeniyle olur. Ve en sonuncusu, ikinci iş parçacığının ilk iş parçacığından önce başlaması, ilk iş parçacığı çalıştırılmadan önce 'tamam' değişkeninin doğru olmasına neden olduğu için olur.