一.synchronized锁重入
关键字synchronized拥有所重入的功能,也就是在使用synchronized时,当一个线程获取一个锁对象时,再去获取这个对象的锁,还是可以得到的.实例如下.
public class Test3 {
public synchronized void method1(){ //以下三个方法都加锁了
System.out.println("执行method1");
method2();
}
private synchronized void method2() {
System.out.println("执行method2");
method3();
}
private synchronized void method3() {
System.out.println("执行method3");
}
public static void main(String[] args) {
Test3 test3 = new Test3();
new Thread(new Runnable() {
@Override
public void run() {
test3.method1();
}
}).start();
}
}
执行结果如下:
那么也就是同一个线程去获取test3这个对象锁,是可以的,也就是可重入锁.
二.异常.
在应用程序中,如果因为异常释放锁的情况下,如果不及时处理,可能对业务逻辑产生非常严重的问题,比如你现在在执行一个队列任务,很多对象都在等待第一个对象正确执行完毕后,再去释放锁,但是第一个对象由于异常的出现,导致业务逻辑没有正常执行完,那么可想而知后面的对象执行都是错误的,所以这一点一定要注意,在编写代码的时候,一定要考虑周全.