Java并发之Lock第一季(含synchronized对比)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cadi2011/article/details/84849263

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(中文名字:重入锁)

猜你喜欢

转载自blog.csdn.net/cadi2011/article/details/84849263