这个问题要从两个角度回答:
非功能层面
坊间传闻,从synchronized被优化后,效率略微高于lock,比较有利的证据是在1.8中ConcurrentHashMap处理同步时,直接使用了synchronized而不再使用lock。这个从某种程度上说明sun对自己的亲儿子还是比较认可的。
功能层面
- lock支持tryLock、lockInterruptibly和超时获取锁,synchronized都不支持
- lock支持公平、非公平两种锁,但是synchronized只能是非公平
- 使用lock时,必须手动unlock(从书写规范的角度看,必须在finally中unlock),但是synchronized不需要关心unlock,编译器会处理
- lock支持多条件(多condition)的等待队列,synchronized只有一个等待队列(object.wait())
- lock中有读写锁,可以做到读读并发,读写互斥,写写互斥,但是synchronized做不到