-
Synchronized和Lock都是可重入锁,但synchronized不是可中断锁,而Lock是可中断锁。
-
Synchronized底层:使用指令码方式来控制锁的,映射成字节码指令就是增加两个指令:monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁,如果获取锁则锁计数器加1,如果获取锁则阻塞;当线程遇到monitorxit指令是则锁计数器-1,如果计数器为0则释放锁。
-
Lock的底层:是CAS乐观锁,依赖AbstractQueuedSynchronizer类,把所有的线程构成一个自旋锁队列。而对该队列的操作均通过Lock-Free(CAS)操作。
-
Synchronized是关键字, 内置语言实现,Lock是接口。
-
Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁;Lock异常时不会自动释放锁,需要在finally中实现释放锁。
-
Lock是可中断锁;Synchronized是非中断锁,必须等待线程执行完成释放锁。
-
Lock可以使用读锁提高多线程并发读的效率。
Synchronized优点:实现简单,语义清晰,便于JVM堆栈追踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛。
Synchronized缺点:悲观的排他锁,不能进行高级功能。
Lock优点:可定时的、可轮询的与可中断的获取锁操作,提供了读写锁(ReentrantReadWriteLock),公平锁和非公平锁。
Lock缺点:需要手动释放锁(unlock),不适合JVM进行堆栈追踪。