synchronized 是 Java 内建的同步机制,因此也有人称其为 Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其余试图获取的线程只能等待或者阻塞在那里。性能
在 Java 5 之前,synchronized 是仅有的同步手段,在代码中, synchronized 能够用来修饰方法,也可使用在特定的代码块儿上,本质上 synchronized 方法等同于把方法所有语句用 synchronized 块包起来。编码
ReentrantLock,一般翻译为再入锁,是 Java 5 提供的锁实现,它的语义和 synchronized 基本相同。再入锁经过代码直接调用 lock() 方法获取,代码书写也更加灵活。与此同时,ReentrantLock 提供了不少实用的方法,可以实现不少 synchronized 没法作到的细节控制,好比能够控制 fairness,也就是公平性,或者利用定义条件等。可是,编码中也须要注意,必需要明确调用 unlock() 方法释放,否则就会一直持有该锁。线程
synchronized 和 ReentrantLock 的性能不能一律而论,早期版本 synchronized 在不少场景下性能相差较大,在后续版本进行了较多改进,在低竞争场景中表现可能优于 ReentrantLock。翻译