public class T {
int count = 0;
synchronized void m() {
System.out.println(Thread.currentThread().getName() + " start");
while(true) {
count ++;
System.out.println(Thread.currentThread().getName() + " count = " + count);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(count == 5) {
int i = 1/0; //此处抛出异常,锁将被释放,要想不被释放,可以在这里进行catch,然后让循环继续
System.out.println(i);
}
}
}
public static void main(String[] args) {
T t = new T();
Runnable r = new Runnable() {
@Override
public void run() {
t.m();
}
};
new Thread(r, "t1").start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(r, "t2").start();
}
}
如题, 发生异常的时候,synchronized锁释放,线程t2得以执行
但是要注意的是,对于显式锁, 如ReentrantLock,在发生异常的时候,必须要手动释放锁。
如果执行的代码段有可能发生异常,我们通常要这样处理, 需要在finally里面释放资源
try {
//可能发生异常的代码
...
} catch (Exception ex) {
} finally {
//释放锁
lock.unlock();
//释放IO资源
io.close();
}