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

发布时间:2023年12月31日

目录

概述

一、特性区别

二、用法区别

三、性能区别

四、用途区别


蜗牛学苑-重构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职业教育新生态

文章来源:https://blog.csdn.net/gnwu1111/article/details/135308444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。