上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)方法被调用后并不释放锁。