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