關鍵技術:
- 當線程進入對象的synchronized代碼時,便占據了資源,直到它退出該代碼塊或者調用wait方法時,才釋放該資源,在此期間,其他線程將不能進入該代碼塊。
- 當線程互相持有對方需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放占據的資源,將產生死鎖。
package book.thread;
/**
* 一個線程死鎖的例子
*/
public class DeadLock {
public static void main(String[] args) {
// 2個資源
final Object resource1 = "resource1";
final Object resource2 = "resource2";
// 第一個線程,想先占有resource1,再嘗試著占有resource2
Thread t1 = new Thread() {
public void run() {
//嘗試占有了resource1
synchronized (resource1) {
//成功占有resource1
System.out.println("Thread 1: locked resource 1");
//休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
// 嘗試著占有resource2,如果不能占有,該線程會一直等待
synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};
// 第二個線程,想先占有resource2,再占有resource1
Thread t2 = new Thread() {
public void run() {
// 嘗試著占有resource2
synchronized (resource2) {
// 成功占有resource2
System.out.println("Thread 2: locked resource 2");
// 休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
// 嘗試占有resource1,如果不能占有,該線程會一直等待
synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
// 啟動兩個線程
t1.start();
t2.start();
}
}
/**
* 一個線程死鎖的例子
*/
public class DeadLock {
public static void main(String[] args) {
// 2個資源
final Object resource1 = "resource1";
final Object resource2 = "resource2";
// 第一個線程,想先占有resource1,再嘗試著占有resource2
Thread t1 = new Thread() {
public void run() {
//嘗試占有了resource1
synchronized (resource1) {
//成功占有resource1
System.out.println("Thread 1: locked resource 1");
//休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
// 嘗試著占有resource2,如果不能占有,該線程會一直等待
synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};
// 第二個線程,想先占有resource2,再占有resource1
Thread t2 = new Thread() {
public void run() {
// 嘗試著占有resource2
synchronized (resource2) {
// 成功占有resource2
System.out.println("Thread 2: locked resource 2");
// 休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
// 嘗試占有resource1,如果不能占有,該線程會一直等待
synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
// 啟動兩個線程
t1.start();
t2.start();
}
}
-- 學海無涯