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

synchronized和lock的不同

底层实现

synchronized基于jvm底层的数据同步

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

释放锁的方式

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

lock必须手动释放锁

获取锁的方式

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

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

锁状态判断的区别

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