大厂面试题-synchronized和Lock的区别

目录

概述

一、特性区别

二、用法区别

三、性能区别

四、用途区别


蜗牛学苑-重构IT职业教育新生态

概述

最近多位被问到synchronizedLock,据说还是阿里一面的面试题。在分布式开发中,锁是控制线的重要方式。Java提供了两种锁机制synchronizedLock。接下来

synchronizedLock都是Java中用来解决线程安全问题的一个工具,那么关于synchronizedLock的区别,从以下4个方面来给大家来做一个详细的分析

一、特性区别

1、synchronized是Java内置的一个线程同步关键字

2、Lock是J.U.C包下面的一个接口,它有很多实现类,比如ReentrantLock就是它的一个实现类。

二、用法区别

synchronized可以写在需要同步的对象、方法或者是特定代的码块中。主要有两种写法,比如这样:

一种是把synchronized修饰在方法上

//控制方法

public synchronized void sync(){

}

一种是把 synchronized 修饰在代码块上

Object lock = new Object();

//控制代码块

public void sync(){

    synchronized(lock){

    }

}

用这种方式来控制锁的生命周期。而 Lock 控制锁的粒度是通过 lock() 和  unlock() 方法来实现的 ,以ReentrantLock 为例 ,来看这样一段代码:

Lock lock = new ReentrantLock();

public void sync(){

    lock.lock();    //添加锁

    // 线程安全的代码

    lock.unlock(); //释放锁

}

这种方式是可以保证 lock()方法和 unlock()方法之间的代码是线程安全的。而锁的作用域,取决于Lock例的生命周期。

Locksynchronized在使用上相对来说要更加灵活一些。Lock可以自主地去决定什么时候加锁,什么释放锁。只需要调用lock()和unlock()这两个方法就可以了。需要注意的是,为了避免死锁,一般我unlock()方法写在finally块中。

另外,Lock还提供了非阻塞的竞争锁的方法叫trylock(),这个方法可以通过返回true或者fasle来告诉当前线程是否已经有其他线程正在使用锁

synchronized是关键字,无法去扩展实现非阻塞竞争锁的方法。另外,synchronized只有代码块执行或者代码出现异常的时候才会释放锁,因此,它对锁的释放是被动的。

三、性能区别

synchronized和Lock在性能上差别不大。在实现上有一些区别,synchronized采用的是悲观锁机制,synchronized是托管给JVM执行的。在JDK1.6以后采用了偏向锁、轻量级锁、重量级锁及锁升级的方式进行优化。

Lock用的是乐观锁机制。控制锁的代码由用于自定义,也采用CAS自旋锁进行了优化。

四、用途区别

二者在一般情况下没有什么区别,但是在非常复杂的同步应用中,建议使用Lock。因为synchronized只提供了非公平锁的实现,而Lock提供了公平所和非公平锁的机制。

公平锁是指线程竞争锁资源的时候,如果已经有其他线程正在排队或者等待锁释放,那么当前竞争锁的线是无法去插队的。

而非公锁就是不管是否线程再排队等待锁,它都会去尝试竞争一次锁。

蜗牛学苑-重构IT职业教育新生态

相关推荐

  1. 面试:Jvm synchronized JDK Lock

    2023-12-31 17:50:02       30 阅读
  2. synchronized Lock 区别是什么

    2023-12-31 17:50:02       45 阅读
  3. synchronizedvolatile区别

    2023-12-31 17:50:02       52 阅读
  4. Synchronizedvolatile区别

    2023-12-31 17:50:02       57 阅读
  5. Synchronized ReentrantLock 区别

    2023-12-31 17:50:02       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-31 17:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-31 17:50:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-31 17:50:02       82 阅读
  4. Python语言-面向对象

    2023-12-31 17:50:02       91 阅读

热门阅读

  1. pyqt的qlabel样式调整办法

    2023-12-31 17:50:02       57 阅读
  2. CJ系列D-Net使用手册

    2023-12-31 17:50:02       49 阅读
  3. VIM8 文本实战学习

    2023-12-31 17:50:02       51 阅读
  4. 算法训练营Day32

    2023-12-31 17:50:02       61 阅读
  5. WPF 基础入门(样式)

    2023-12-31 17:50:02       61 阅读
  6. 什么是ajax,为什么使用ajax?

    2023-12-31 17:50:02       66 阅读
  7. ssh连接docker与宿主机进入docker环境变量不一致

    2023-12-31 17:50:02       72 阅读
  8. 多开工具对手机应用启动速度的优化与改进

    2023-12-31 17:50:02       60 阅读
  9. 配置yum镜像源

    2023-12-31 17:50:02       46 阅读
  10. 速盾网络:cdn数量对网站访问速度的影响

    2023-12-31 17:50:02       61 阅读