1、简单回顾一下synchronized
a、一个Java中的关键字
b、一个普通代码块被synchronized修饰,那么锁就是当前对象,当一个线程对象A获得了对象锁,并执行该代码块时,其他的线程对象B或其他名字,便会一直等待,一直等待线程A释放锁
c、线程A在什么情况下会释放锁?
c-1、线程A执行完了该代码块,哥用完了,此时会释放掉对象锁(当前对象)
c-2、线程A在执行代码块过程中,抛出了异常,此时JVM会让线程A释放掉锁
c-3、有个wait()方法,线程A在执行代码块时,碰见了wait()方法,就在原地等待,然后立刻释放掉锁,一直等着有人唤醒它。。尴尬
d、现在出现一个问题,拿到锁的线程A,由于各种原因被阻塞了,例如等待IO,调用sleep()方法,然后又没有释放锁
e、其他线程兄弟们只能一直等待线程A释放锁,一直等它,艹,等到猴年
f、这出现了一个需求,就是无论线程A执行成什么屌丝样,还是遇到什么,我要求它必须要释放掉锁,不能影响其他线程,而且我想知道到底在哪释放掉锁,synchronized就是你不知道它在哪上的锁,不知道它真正在哪释放的锁,你也控制不了
g、这就引出了Lock,Lock能看见在哪上的锁,还能显式的看见在哪释放掉锁,这又是一次隐式与显式的妙用,Lock更方便的管理锁机制,感觉大牛觉得自己挖了坑,自己要来填一样
2、Lock是一个类、牛13的类,而synchronized是关键字
3、Lock可以知道知道线程对象有没有获得锁,这是synchronized不具备的能力
4、Lock通过代码实现锁,所以你要保证会释放掉锁,比如发生异常,你要在finally{}中显式的调用unLock()方法,释放锁
5、synchronized是在JVM层面上实现的,在代码出现异常时,JVM会自动释放掉锁,而且监控工具可以监控synchronized的锁定
6、在资源竞争很一般的情况下,synchronized的性能优于ReenTrantLock(Lock的扩展类)
7、如果线程对于资源的竞争很激烈,synchronized的性能会很烂,远远不如ReenTrantLock(中文名字:重入锁)