synchronized 是 java 内置的关键字,它提供了一种独占的加锁方式。synchronized 的获取和释放锁由 jvm 实现,用户不需要显示的释放锁,非常方便,然而 synchronized 也有一定的局限性,例如:
当线程尝试获取锁的时候,如果获取不到锁会一直阻塞,这个阻塞的过程,用户无法控制
如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待
JDK1.5 之后发布,加入了 Doug Lea 实现的 java.util.concurrent 包。包内提供了 Lock 类,用来提供更多扩展的加锁功能。Lock 弥补了 synchronized 的局限,提供了更加细粒度的加锁功能。