Java多线程-死锁
package com.swust.four;
/**
* 多线程因为竞争资源而产生死锁
* 在操作系统中,临界资源是同一时间只准一个进程使用的资源,
* 临界区是进程访问临街资源期间所执行的那段程序。产生死锁
* 所需要的四个必要条件是:
* 1.临界资源使用的互斥性。
* 2.部分地分配资源
* 3.资源的循环等待
* 4.资源的不可抢占性
* 对于Java而言,死锁主要是线程死锁。临界资源就是同一时间只
* 准一个线程使用的资源,临界区是线程访问临界资源所执行的那
* 段程序。Java中的synchronized就是用来保持临界区同步的。
* @author 死锁
*/
public class DeadLock {
public static void main(String[] args) {
//定义线程竞争的两个临界资源
final Object resourceOne = "resourceOne";
final Object resourceTwo = "resourceTwo";
//第一个线程,先竞争resourceOne,后竞争resourceTwo
Thread t1 = new Thread(){
public void run(){
//锁定resourceOne
synchronized(resourceOne){
System.out.println("Thread 1: locked resourceOne");
//线程休眠一段时间
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO: handle exception
}
//竞争resourceTwo
synchronized (resourceTwo) {
System.out.println("Thread 1: locked resourceTwo");
}
}
}
};
//第二个线程,先竞争resourceTwo,后竞争resourceOne
Thread t2 = new Thread(){
public void run(){
synchronized (resourceTwo) {
System.out.println("Thread 2: lockede resouceTwo");
//线程休眠
try {
Thread.sleep((int)Math.random()*100);
} catch (InterruptedException e) {
// TODO: handle exception
}
synchronized (resourceOne) {
System.out.println("Thread 2: locked resourceOne");
}
}
}
};
//启动线程
t1.start();
t2.start();
}
}
//结果分析
如此可见 Thread1和Thread2始终都得不到他们想要的资源,thread1想要resourceTwo的资源始终被thread2占用
thread2想要resourceOne的资源始终被thread1占用。