Synchronized和Lock的区别,该如何选择?

synchronized和lock的不同

底层实现

synchronized基于jvm底层的数据同步

lock基于java编写一个类,主要通硬件依赖CPU指令实现数据同步

释放锁的方式

synchronized是在同步代码块执行完毕或出现异常时jvm会让线程释放锁

lock必须手动释放锁

获取锁的方式

synchronized中加入A线程获得了锁或处于阻塞状态,则其他线程会一直等待

lock有多个锁获取的方式,可以尝试获得锁,线程可以不用一直等待

锁状态判断的区别

扫描二维码关注公众号,回复: 13403876 查看本文章

synchronized无法判断

lock可以判断锁状态

锁类型的区别

synchronized中可重入 不可中断 非公平

lock可重 可判断 可公平

性能区别

synchronized少量同步

lock大量同步

synchronized和lock的相同

都是利用线程阻塞(BLOCKING)来实现同步的,

都使用基于锁的阻塞算法,一个内置锁(intrinsic lock)一个显示锁

性能方面差异小

synchronized和lock的优缺点

synchronized

缺点:不能进行高级功能(定时,轮询和可中断等)

优点:实现简单,语义清晰,便于JVM堆栈跟踪.加锁解锁过程中由jvm自动控制,提供多种优化方案

lock

缺点:需要手动释放锁(unlock),不适合jvm进行堆栈跟踪

优点:可定时,可轮询,可中断的锁获取操作,提供读写锁,公平锁,非公平锁

总结

性能上

如果竞争资源不激烈,两者的性能差不多

竞争非常激烈时(大量线程同时竞争),lock的性能远远高于synchronized

功能上

如果需要自定义更多高级的而动能,lock更适合

出身上

更可能提升性能的是synchronized而不是ReentrantLock,因为Synchronized是JVM的内置属性,具备进一步优化的可能性

猜你喜欢

转载自blog.csdn.net/m0_46357303/article/details/121276234