【面试题002】synchronized和lock的区别

这是一道Java多线程同步机制的经典面试题,接下来我将从三个方面来系统性的对synchronized和lock进行比对分析。

1.从功能角度上来看:synchronized和lock都是java中解决线程安全问题的一个工具。

2.从特性方面来看:

  1. synchronized是java中的一个关键字,而lock是J.U.C包下提供的接口,这个接口又有很多的实现类,其中就包括ReentrantLock这一重入锁的实现。
  2. synchronized可以通过两种方式去控制锁的粒度,把synchronized修饰在方法层面和修饰在代码块上。并且可以通过加锁对象的生命周期,来控制锁的作用范围。如锁的对象是静态对象或者类对象,锁就属于全局锁;若锁的对象是普通的实例对象,则锁的范围取决于这个实例的生命周期。而lock中的锁的力度是通过它里面提供的lock()和unlock()方法来决定的。包裹在两个方法之间的代码是线程安全的,而锁的作用取决于lock实例的生命周期。
  3. lock比synchronized的灵活度更高。lock可以自主决定什么时候加锁,什么时候释放锁,只需要调用lock()方法和unlock()方法就行。同时,lock还提供了非阻塞竞争锁的方法——tryLock(),该方法可以通过返回true/false,来告诉当前线程是否还有其他线程在使用锁。而由于synchronized是关键字,只有当synchronized的同步代码块执行结束后,或者代码出现异常的时候才会被释放。最后lock还提供了公平锁和非公平锁的机制。公平锁是指线程竞争 锁资源的时候,如果已经有线程正在排队或者等待锁释放,那么当前线程是无法插队的;而非公平锁是不管当前有没有线程等待锁,它都会尝试去竞争一次。synchronized是提供了一种非公平锁的实现。

3.从性能方面来看:synchronized和lock在性能方面相差并不大,但是实现上有一定的区别。synchronized引入了偏向锁、轻量级锁、重量级锁以及锁升级的机制去实现锁的优化。lock则用到了自旋锁的方式去实现锁的优化。

以上就是我对synchronized和lock的解析,其中同时也提到了关于公平/非公平锁、偏向锁、自旋锁等核心知识,也是面试中常常会被问到的问题,同样也值得大家深入学习掌握。

你可能感兴趣的:(java,线程)