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的内置属性,具备进一步优化的可能性