synchrouized 隐式锁
lock 显式锁
线程不安全,多个线程同时运行时,很可能发生线程安全问题
synchrouized和lock的区别
1、公平锁与非公平锁: synchronized是非公平锁,其实除了Lock类设置为公平锁以外都是非公平锁,他们选择下一个线程是随机就近进入,抢占式的方式,而Lock类锁传true设置后是按线程申请顺序排队进入
2、synchronized底层依赖于软件层面上的JVM,而Lock类依赖于特殊的CPU指定,可以认为不受JVM的约束,并可以通过其他语言平台来完成底层的实现。在并发量较小的多线程应用程序中,Lock类与synchronized性能相差无几,但在高并发量的条件下,synchronized性能会迅速下降几十倍,而ReentrantLock的性能却能依然维持一个水准,因此我们建议在高并发量情况下使用ReentrantLock。
3、使用Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁
4、Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁
5、总的来说Lock可以使用读锁提高多线程读效率,更直观方便。
6、从sync和lock的出身(原始的构成)来看看两者的不同。
7、Sync:Java中的关键字,是由JVM来维护的。是JVM层面的锁。
8、Lock:是JDK5以后才出现的具体的类。使用lock是调用对应的API。是API层面的锁
9、sync是底层是通过monitorenter进行加锁(底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖于monitor对象的。只有在同步块或者是同步方法中才可以调用wait/notify等方法的。因为只有在同步块或者是同步方法中,JVM才会调用monitory对象的);通过monitorexit来退出锁的。
10、而lock是通过调用对应的API方法来获取锁和释放锁的。
synchrouized和lock的使用方式不同
所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。
我们大家都知道,在使用sync关键字的时候,我们使用者根本不用写其他的代码,然后程序就能够获取锁和释放锁了。那是因为当sync代码块执行完成之后,系统会自动的让程序释放占用的锁。Sync是由系统维护的,如果非逻辑问题的话话,是不会出现死锁的。
在使用lock的时候,我们使用者需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。手动获取锁方法:lock.lock()。释放锁:unlock方法。需要配合tyr/finaly语句块来完成。
网友评论