死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。
- <span style="font-family:Arial;">
- /**
- * 演示死锁的一个小程序
- * @author amber2012
- *
- */
- public class DeadLock {
- private Object obj_1 = new Object();
- private Object obj_2 = new Object();
- public static void main(String[] args) {
- final DeadLock deadLock = new DeadLock();
- // 第一个线程
- new Thread(new Runnable(){
- public void run() {
- try {
- deadLock.method_1();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }).start();
- // 第二个线程
- new Thread(new Runnable(){
- public void run() {
- try {
- deadLock.method_2();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }).start();
- }
- public void method_1() throws InterruptedException{
- synchronized (obj_1) {
- Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_2的执行权
- synchronized (obj_2) {
- System.out.println("DeadLock.method_1()");
- }
- }
- }
- public void method_2() throws InterruptedException{
- synchronized (obj_2) {
- Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_1的执行权
- synchronized (obj_1) {
- System.out.println("DeadLock.method_2()");
- }
- }
- }
- }
- </span>