`

Java并发之显式锁和隐式锁的区别

 
阅读更多

Java并发之显式锁和隐式锁的区别

 

在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称:sync)和lock(下文就用ReentrantLock来代之lock)的区别。

本文主要内容:将通过七个方面详细介绍sync和lock的区别。通过生活case中的X二代和普通人比较大家更容易理解这两者之间的区别

Java中隐式锁:synchronized;显式锁:lock

sync和lock的区别

一:出身不同

从sync和lock的出身(原始的构成)来看看两者的不同。

Sync:Java中的关键字,是由JVM来维护的。是JVM层面的锁。

Lock:是JDK5以后才出现的具体的类。使用lock是调用对应的API。是API层面的锁

sync是底层是通过monitorenter进行加锁(底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖于monitor对象的。只有在同步块或者是同步方法中才可以调用wait/notify等方法的。因为只有在同步块或者是同步方法中,JVM才会调用monitory对象的);通过monitorexit来退出锁的。

而lock是通过调用对应的API方法来获取锁和释放锁的。

我们通过Javap命令来查看调用sync和lock的汇编指令:

编辑

从编译后的汇编指令,我们也能够清晰的看出sync关键字和lock的区别。

第一不同一句话概述:可以把sync理解为官二代或者是星二代。从娘胎出来自带光环的。Lock就是我们普通努力上进的人。

二:使用方式不同

Sync是隐式锁。Lock是显示锁

所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。

我们大家都知道,在使用sync关键字的时候,我们使用者根本不用写其他的代码,然后程序就能够获取锁和释放锁了。那是因为当sync代码块执行完成之后,系统会自动的让程序释放占用的锁。Sync是由系统维护的,如果非逻辑问题的话话,是不会出现死锁的。

在使用lock的时候,我们使用者需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。手动获取锁方法:lock.lock()。释放锁:unlock方法。需要配合tyr/finaly语句块来完成。

两者用法对比如下:

编辑

用生活中的一个case来形容这个不同:官二代和普通人的你在进入机关大院的时候待遇。官二代不需要出示什么证件就可以进入,但是你需要手动出示证件才可以进入。

三:等待是否可中断

Sync是不可中断的。除非抛出异常或者正常运行完成

Lock可以中断的。中断方式:

1:调用设置超时方法tryLock(long timeout ,timeUnit unit)

2:调用lockInterruptibly()放到代码块中,然后调用interrupt()方法可以中断

生活中小case来理解这一区别:官二代一般不会做饭。都会去餐厅点餐等待着餐厅出餐。普通人的你既可以去餐厅等待,如果等待时间长的话,你就可以回去自己做饭了。

四:加锁的时候是否可以公平

Sync;非公平锁

lock:两者都可以的。默认是非公平锁。在其构造方法的时候可以传入Boolean值。

true:公平锁

false:非公平锁

生活中小case来理解这个区别:官二代一般都不排队,喜欢插队的。普通人的你虽然也喜欢插队。但是如果遇到让排队的情况下,你还是会排队的。

Lock的公平锁和非公平锁:

 

五:锁绑定多个条件来condition

Sync:没有。要么随机唤醒一个线程;要么是唤醒所有等待的线程。

Lock:用来实现分组唤醒需要唤醒的线程,可以精确的唤醒,而不是像sync那样,不能精确唤醒线程。

六:从性能比较

 

生活小case理解:在我们一般的认知中,官二代一般都是比较坑爹的吧。但是这几年也有很多官二代或者是富二代改变了态度,端正自己态度,靠自己能力而不是拼爹了。

七:从使用锁的方式比较

                                                                        欢迎来聊~

 

0
2
分享到:
评论

相关推荐

    笔记-4、显式锁和AQS1

    在Java并发编程中,显式锁(Lock)和隐式锁(synchronized)是两种常见的锁机制,它们提供了对共享资源的互斥访问。显式锁通过Java的Lock接口实现,而隐式锁主要依赖于synchronized关键字。 **Lock接口和...

    笔记-4、显式锁和AQS(1)1

    总之,显式锁和AQS的出现极大地丰富了Java并发编程的能力,通过定制化同步策略,我们可以更好地应对复杂多变的并发场景。理解并熟练掌握AQS的工作原理和设计模式,将有助于我们编写出高效、安全的并发程序。

    实现Java高并发隔离 模拟

    有显式锁(如`java.util.concurrent.locks.Lock`接口)和隐式锁(`synchronized`关键字)两种形式。 3. **读写锁(ReentrantReadWriteLock)**:当读操作远多于写操作时,`java.util.concurrent.locks....

    java 并发编程、java虚拟机学习

    - **锁机制**:包括显式锁(如`ReentrantLock`)和隐式锁(如`synchronized`关键字)。 - **原子变量**:例如`AtomicInteger`,提供了一种无需锁就能实现线程安全的方式。 - **并发工具类**:如`CountDownLatch`、`...

    Java并发面试题整理(答案).docx

    12、ReentrantLock 与 synchronized 的区别ReentrantLock(可重入锁)是 Java 中的显式锁,相比 synchronized 具有更高的灵活性,支持公平锁和非公平锁,还提供了一些高级功能,如中断锁等待、尝试获取锁和定时获取...

    Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf

    在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java内存模型和线程同步机制。 **可重入锁与可重入性** 可重入锁允许同一个线程反复进入它已经拥有的锁所保护的代码段。在Java中,...

    Java多线程之显示锁和内置锁总结详解

    总结来说,Java多线程中的内置锁和显式锁各有优劣。内置锁简洁易用,但控制有限;显式锁提供了更多灵活性,但使用起来相对复杂。根据具体应用场景选择合适的锁机制,能有效提高并发程序的性能和可维护性。

    并发编程从入门到放弃系列开始和结束.doc

    锁是并发控制的关键,Java提供了两种类型的锁:隐式锁和显示锁。隐式锁主要通过`synchronized`关键字实现,它提供了原子性和内存可见性。当线程进入`synchronized`代码块时,会尝试获取对象锁,成功后计数器加1,...

    层次业务模型的同步锁设计

    synchronized是内置的、隐式的锁,而ReentrantLock和ReadWriteLock属于显式锁,提供了更细粒度的控制和更丰富的功能。 在层次业务模型中,合理使用同步锁至关重要。例如,可以使用synchronized关键字来保护关键代码...

    java 文档:JAVA核心知识点面试文档

    在Java中,类型转换分为隐式和显式转换。隐式转换是从存储需求较小的数据类型到存储需求较大的数据类型,例如从byte到int。显式转换,即强制类型转换,是从存储需求较大的类型转换到较小的类型,需要注意可能的精度...

    JVM_多线程高并发_集合框架_数据库 BAT面试金典常见80问.pdf

    《JVM_多线程高并发_集合框架_数据库 BAT面试金典常见80问.pdf》这份资料聚焦于Java开发人员在面试中可能遇到的重要问题,涵盖了JVM、多线程高并发、集合框架和数据库等多个核心领域。以下是对这些知识点的详细说明...

    2019最全的java面试题

    在Java面试中,还会考察对Java集合框架的理解,如List、Set、Map的用法和特性,以及对Java中的异常处理机制、Java I/O流、多线程和并发编程等要点的掌握。对于算法的掌握程度,通常会要求面试者解决一些典型的算法...

    java 同步方法

    2. **使用并发工具**:Java提供了一些并发工具类,如`java.util.concurrent`包中的`Atomic`类、`ConcurrentHashMap`等,这些工具设计用于在没有显式锁的情况下处理并发问题,能有效减少争用。 3. **避免锁的粒度过...

    OrderingMultipleThreadsUsingExplicitLock:此示例将有助于使用内在锁(即,使用Java 1.5的并发包中引入的锁)来按顺序运行多个线程。

    Java 1.5引入了并发包(`java.util.concurrent`),为开发者提供了丰富的工具来管理和控制线程,其中就包括了显式锁(`java.util.concurrent.locks.Lock`)。本示例"OrderingMultipleThreadsUsingExplicitLock"主要讲解...

    Java锁之可重入锁介绍

    可重入锁是Java并发编程中的一个重要概念,它为开发者提供了更灵活的线程同步机制,保证了线程安全,并有效避免了死锁。无论是内置的 `synchronized` 还是 `java.util.concurrent.locks.ReentrantLock`,都通过可重...

    Java 面试题汇总及解答

    3. **锁机制**:Java提供了多种锁来实现线程同步,包括synchronized关键字(隐式锁)、Lock接口(显式锁)、ReentrantLock(可重入锁)、Semaphore(信号量)等。它们主要用于解决并发环境中的数据一致性问题,防止...

    深入理解Java内存模型

    在深入理解Java内存模型之前,我们首先需要了解并发编程中的两个基本问题:线程间的通信和线程间的同步。 在并发编程中,线程间的通信是指线程之间如何交换信息,主要有两种并发模型。共享内存并发模型中,线程之间...

    Java面试题2020-7-13-未压缩.pdf

    标题“Java面试题2020-7-13-未压缩.pdf”和描述表明,本文档是一份涵盖了Java编程语言从基础知识到框架应用、从微服务架构到数据库和Redis技术的全面面试题集。这些面试题目由Tang Yong Hong在2020年7月12日整理,...

Global site tag (gtag.js) - Google Analytics