当两个线程同时拥有一定的资源,但是都缺少对方手上的资源才能进行下一步动作,而去竞争对方的资源,从而都陷入等待的一种场景,这种场景被称为死锁。例如:A、B线程在运行开始时分别持有a、b对象,A拥有a,对象a被A上锁了,B拥有b,对象b被B上锁了,此时,线程A在要往后运行需要对象b,而线程B要往后运行需要对象a,此时A、B线程都希望获得对方的资源,但是手上的资源都不愿拿出来,这个时候就形成了“僵局”,进入了死锁。
死锁的一个例子:
package com.threads;
/**
* Package: com.threads
*
* File: MainMethod.java
*
* Copyright @ 2015 Corpration Name
*
*/
public class MainMethod {
public Object objA;
public Object objB;
public MainMethod() {
objA = new Object();
objB = new Object();
}
public void StartThreads(){
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
a.start();
b.start();
}
class ThreadA extends Thread{
public void run(){
synchronized (objA) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (objB) {
}
}
}
}
class ThreadB extends Thread{
public void run(){
synchronized (objB) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (objA) {
}
}
}
}
public static void main(String[] args){
MainMethod m = new MainMethod();
m.StartThreads();
}
}