Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

2.1.9 出现异常,锁自动释放

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

创建实验项目throwExceptionNoLock,类Service.java代码如下:


package service;

public class Service {
synchronized public void testMethod() {
    if (Thread.currentThread().getName().equals("a")) {
        System.out.println("ThreadName=" + Thread.currentThread().getName()
            + " run beginTime=" + System.currentTimeMillis());
        int i = 1;
        while (i == 1) {
            if (("" + Math.random()).substring(0, 8).equals("0.123456")) {
                System.out.println("ThreadName="
                    + Thread.currentThread().getName()
                    + " run   exceptionTime="
                    + System.currentTimeMillis());
                Integer.parseInt("a");
            }
        }
    } else {
        System.out.println("Thread B run Time="
            + System.currentTimeMillis());
    }
}
}

两个自定义线程代码如图2-15所示。

图2-15 两个线程类代码

运行类Run.java代码如下:


package controller;

import service.Service;
import extthread.ThreadA;
import extthread.ThreadB;

public class Test {

public static void main(String[] args) {
    try {
        Service service = new Service();

        ThreadA a = new ThreadA(service);
        a.setName("a");
        a.start();

        Thread.sleep(500);

        ThreadB b = new ThreadB(service);
        b.setName("b");
        b.start();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

程序运行结果如图2-16所示。

图2-16 运行效果

线程a出现异常并释放锁,线程b进入方法正常输出,说明出现异常时,锁被自动释放了。

注意

类Thread.java中的suspend()和sleep(millis)方法被调用后并不释放锁。