1.可重入:指的同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁。(递归锁)
好处:避免死锁,提升封装性
粒度:线程
方法调用自己,方法调用其他方法,方法调用父类方法;
2.不可中断
一旦锁被别人获得,如果我还想获取,之鞥选择等待或者阻塞,直到其他线程释放该锁。
Lock可以中断的!
6.缺陷
(1)效率低:锁释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程
(2)灵活度底:加锁和释放的时机单一,每个锁仅有单一的条件(某个对象)
(3)无法知道是否成功获取锁
二、常见面试问题
1.使用注意点:锁对象不能为空、作用域不宜过大(包裹范围)、避免死锁
2.如何选择Lock和synchronized
尽量使用现成java.util.concurrent的CountDownLatch的类,等现有的工具类;
先用synchronized,使用简单;
特殊情况下(需要灵活加解锁)使用Lock;
3.多线程访问同步方法的各种情况(上篇博客的7中情况)
一句话介绍synchronized:
使用该关键字,jvm会自动通过monitor来给有效区域的代码加锁解锁,保证了同一时刻只有一个线程可以执行指定代码,从而保证了线程安全,同事具有可重入和不可中断的性质。