- (用法)synchronized是隐式锁,可以用在方法上,也可以用在特定代码块中,由JVM来管理锁的释放。
- (用法)lock是显式锁,需要显式指定起始位置和终止位置,一般使用ReenterantLock类作为锁,多个线程中要使用同一个ReenterantLock对象才能保证锁的生效。在加锁和解锁处需要通过lock和unlock显式指出,所以一般会在finally块中写unlock以防死锁。Lock比synchronized灵活很多。
- (性能)synchronized是托管给JVM执行的,而Lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。因为 这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但 是到了Java1.6,发生了变化。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致 在Java1.6上synchronized的性能并不比Lock差。
- (机制)synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其 他线程只能依靠阻塞来等待线程释放锁。Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就 是CAS操作(Compare and Swap)。
synchronized与lock的区别
最新推荐文章于 2020-12-30 10:34:18 发布