1.效率低:锁的释放情况少,试图获得锁时不能设定超时、不能中断一个正在试图获得释放锁的进程
2.不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的
3.无法知道是否成功获取到锁
----------------------------------------------------------
一:Lock方法
1.lock()就是普通的获取锁,如果锁已经被其他线程获取,则进行等待
2.Lock不会像synchronized一样在异常时自动释放锁,因此需在finally中释放锁,以保证发生异常时锁一定被释放
3、lock()方法不能被中断,这会带来很大的隐患:一旦陷入死锁,lock()就会陷入永久等待
二:tryLock()方法
1.tryLock()用来尝试获取锁,如果当前锁没有被其他线程占用,则获取成功,则返回true,否则返回false,代表获取锁失败
2.相比于lock方法,这样的方法显然功能更强大了,我们可以根据是否能获取锁来决定后续程序的行为
----------------------
可重入性锁ReentrantLock,synchronized都是
好处:避免死锁
-----------------------------------------
实际上,如果说Lock用来代替synchronized,那么Condition就是用来代替相应的Object.wait/notify的,所以在用法和性质上,几乎都一样
Condition的await方法会自动释放持有的Lock锁,和Object.wait一样,不需要自己手动先释放锁
调用await的时候必须持有锁,否则会抛出异常,和Object.wait一样