在面试的过程中有可能会问到:在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理解:在我们一般的认知中,官二代一般都是比较坑爹的吧。但是这几年也有很多官二代或者是富二代改变了态度,端正自己态度,靠自己能力而不是拼爹了。

更多精彩干货 请点击查看

Java队列学习第一篇之列介绍相关推荐

  1. SAP学习第一篇——SAP模块介绍

    SAP 全称:systems applications and products in data processing . SAP是一款用于ERP(企业资源计划)管理的软件. SAP 提供的认证的种类 ...

  2. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

  3. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

  4. MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB 0.确保mac已经安装了HomeBrew ( ...

  5. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  6. VUE源码学习第一篇--前言

    一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...

  7. Java图像处理最快技术:ImageJ 学习第一篇

    ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Image ...

  8. 梓紫的日记,第一篇出场人物介绍,刚开头的正文(一次性写不完)

    疯狂的数学课(作者每周五更) (紫梓日记第一篇) 前言 1. 梓紫是真的人吗? 梓紫呢,是本篇文章的主人公,更准确的说,这篇文章是梓紫的日记. 当然,"梓紫"这个名字,是作者生活中 ...

  9. RISC-V学习-第一篇[指令类型]

    本文是RVSC-V处理器学习的第一篇文章,对RV32IMAFDC指令集的学习笔记. 1. 运算指令 立即数运算指令 addi rd,rs1,imm[11:0] 功能 1.将rs1与12位立即数(进行符 ...

最新文章

  1. TCP/IP详解--学习笔记(11)-TCP交互数据流,成块数据流
  2. python函数 一
  3. python3的float数精度_Python3 - 执行精确的浮点数运算
  4. JUnit学习摘要+入门实例 (junit4)
  5. 用limit 实现java的简单分页
  6. Myesclipe+SSH+jsp+mysql+tomcate实现一个简单的CRM客户关系管理系统
  7. 防火防盗竟防不了网络攻击智能摄像机的网络安全怎么办?
  8. IntelliJ IDEA下载插件超时--解决方法
  9. 蚂蚁集团前三季度营收1181.91亿元 支付宝月活用户7.31亿
  10. 树莓派PICO:DS1302时钟芯片(MicroPython)
  11. 如何快速成为数据分析师(个人角度)
  12. App列表之下拉刷新
  13. 华大单片机HC32L130/HC32L136红外端口配置
  14. 一个长二进制串,求除3的余数
  15. IC design的初期阶段(floorplan和place初期)的检查清单checklist
  16. genus 综合流程
  17. FSL安装教程(Ubuntu)
  18. 重大新生入学计算机考试试题,2021年度新生福利大学计算机基础入学考试题库.doc...
  19. IDEA安装Activiti画图插件
  20. Oracle SQL调优系列之no_unnest和unnest用法简介

热门文章

  1. matplotlib 散点图_Python学习 —— matplotlib绘制三维曲线图和三维散点图
  2. python mysql绑定变量_python 数据库绑定变量
  3. Redis SLAVE过期键策略
  4. 敏捷开发本质 与 敏捷个人本质
  5. Eclipse:定制toString()
  6. VS2015使用scanf报错解决方案
  7. 解决Table td设置了相同百分比,由于文字个数不同导致列宽不同问题
  8. Cisco Easy ***综合配置示例
  9. ListView详解(二)
  10. webpack配置alias别名设置