lock和synchronized的区别,看完这篇文章,你就悟了!
功能层面
lock和synchronized都是Java中解决并发安全的一个工具;
特性层面
首先synchronized是Java中的一个同步关键字,而Lock是JUC包里提供的一个接口,而这个接口就包括很多的实现类,其中就包括Reentrantlock这样的一个可重入锁的实现;Synchronized可以有两种方式来控制锁的粒度(一种是修饰方法,一种是修饰代码块)后一种加锁的方式,我么还可以通过加锁对象的生命周期来控制锁的生命周期,比如如果这个对象是静态对象或者类对象,那么这个锁就是全局锁,如果这个锁对象是普通实例对象,那么这个锁的范围取决于这个实例对象的生命周期;lock中锁的粒度的控制是通过它里面的lock()和unlock()方法来实现的,而锁的作用于有是什么了?没错就是lock实例的生命周期;
再来谈一谈其他的特性,首先要讲明的是lock中释放锁和加锁的时机更加灵活,只需要去调用它里面的lock()和unlock()方法就可以了,另外lock实现了一种非阻塞竞争锁的方式,主要是通过trylock()方法来实现的,而由于synchronized是一个关键字,是不能去实现的,并且它的锁的释放时机一定是代码执行结束或者是程序出现异常时就会释放锁.另外lock提供了公平锁和非公平锁的实现,公平锁指的是当前线程如果竞争的资源正在被其他资源排队预加锁,那么这个线程是不会去加锁的,而非公平锁则刚好相反,无论当先资源是否有线程在排队准备预加锁,它都会尝试去加锁.synchronized只是提供了一种非公平锁的一种实现.
性能层面
总体来说看,两者相差不大,但是在实现上会有一定的区别.
synchronized引入了偏向锁,轻量级锁,重量级锁,以及锁升级的机制来去实现锁的优化.而lock则是去使用lock的方式去实现锁的优化.