有人说:轻量级锁一定比重量级锁快!我忍不住笑了

世界上不止有黑白两色,黑与白之间还是灰色的地带。

在成人的世界里,大多数人喜欢非黑即白的观点来看待一个问题,例如《十二公民》中那个刚开始所有人都认定的“一定是富二代杀S了自己的亲身父亲”,到最后大家理性分析和推测之后发现,事情根本不是大多数人(99.9%)以为的那样。

我们很容易被他人的说辞所误导,相信我们愿意相信的事,听我们愿意听的事,然后被舆论所支配,在人云亦云之中渐渐的迷失自我,然后丧失自己独立思考的能力。

学技术也是一样,尽信书不如无书,思考才是学习的目的,如果读书不是为了启迪自己的智慧,只是为了吹NB,那这个人有很大的概率会一事无成。

那此时我们再回过头来思考这个问题:轻量级锁一定比重量级锁快吗

正文

在回答这个问题之前,我们先来了解一下:什么是轻量级锁?什么是重量级锁?

锁概念

轻量级锁是 JDK 1.6 新增的概念,是相对于传统的重量级锁而已的一种状态,在 JDK 1.5 时,synchronized 是需要通过操作系统自身的互斥量(mutex lock)来实现,然而这种实现方式需要通过用户态与和核心态的切换来实现,但这个切换的过程会带来很大的性能开销,所以在 JDK 1.6 就引入了轻量级锁来避免此问题的发生。

轻量级锁执行过程

再讲轻量级锁执行过程之前,要先从虚拟机的对象头开始说起,HotSpot 的对象头(Object Header)分为两部分

  1. Mark Word 区域,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分带年龄等;

  2. 用于存储指向方法区对象类型数据的指针(如果是数组对象的话,还有一个存储数组长度的额外信息)。

Mark Word 在 32 位系统中,有 32bit 空间,其中:

  • 25bit 用来存储 HashCode;

  • 4bit 用来存储对象的分带年龄;

  • 2bit 用来存储锁标志位,01=可偏向锁、00=轻量级锁、10=重量级锁;

  • 1bit 固定为 0。

再说会轻量级锁的执行过程,在代码进入同步块的时候,如果此对象没有被线程所占用,虚拟机会先将此线程的栈帧拷贝一份存储在当前对象的 Lock Record (锁记录) 区域中。

然后虚拟机再使用 CAS (Compare and Swap, 比较并交换) 将本线程的 Mark Word 更新为指向对象 Lock Record 区域的指针,如果更新成功,则表示这个线程拥有了该对象,轻量级锁添加成功,如果更新失败,虚拟机会先检查对象 Mark Word 是否指向了当前线程的线帧,如果是则表明此线程已经拥有了此锁,如果不是,则表明该锁已经被其他线程占用了。如果有两条以上的线程在争抢死锁,那么锁就会膨胀为重量锁,Mark Word 中存储的就是指向重量级锁的互斥量指针,后面等待锁的线程也会进入阻塞状态。

从以上的过程,我们可以看出轻量级锁可以理解为是通过 CAS 实现的,理想的情况下是整个同步周期内不存在锁竞争,那么轻量锁可以有效的提高程序的同步性能,然而,如果情况相反,轻量级锁不但要承担 CAS 的开销还要承担互斥量的开销,这种情况下轻量级锁就会比重量级锁更慢,这就是我们本文的答案。

总结

轻量级锁不是在任何情况下都比重量级锁快的,要看同步块执行期间有没有多个线程抢占资源的情况,如果有,那么轻量级线程要承担 CAS + 互斥量锁的性能消耗,就会比重量锁执行的更慢

关于好与坏和对于错也是这个道理,有些事今天可能是对的,但明天有可能成错的了。比如 JDK 1.5 时,你可以说同步线程只有一个方式:synchronized,然而 JDK 1.6 时又添加了 Lock。你昨天说的对的话,在明天可能就变成错的了。所以对和错其实并不是那么绝对,它也没那么重要,重要的是你得有独立思考的能力和辨识对错认知。

【END】

近期热文

 
  • HashMap 为什么会导致 CPU 100%?面试突击 006 期

  • 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?

  • 面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇

  • 面试突击 003 | Redis 如何实现查询附近的人?

  • 面试突击 002 | Redis 是如何处理已过期元素的?

  • 面试突击 001 | Redis 如何从海量数据中查询出某一个 Key?

关注下方二维码,订阅更多精彩内容

朕已阅 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Django设计模式及模板层

一、Django的MTV模式 MTV代表Model - Template - View (模型-模板-视图)模式。 M模型层(Model)负责与数据交互。 T模板层(Template)负责呈现内容到浏览器。 V视图层(View)是核心&…

在Tomcat中配配置数据源汇总

为什么80%的码农都做不了架构师?>>> Tomcat本身不具备处理提供数据源的能力。借助于一些开源数据源实现,如:DBCP和C3P0等。 一、在http://commons.apache.org/可下载这些是Tomcat提供配置数据源所需的类库。 注意:Tom…

Linux debian安装、配置和使用PuTTY教程

PuTTY是一个小巧、好用、免费的跨平台的访问Linux服务器的终端工具。PuTTY工具可以使用Telnet、SSH、rlogin、纯TCP以及串行接口连接服务器,使用非常广泛。本文主要介绍Debian系统如何安装PuTTY和如何设置该工具的字体、颜色。从而实现个性化定制自己的PuTTY工具&am…

Linux Debian安装FileZilla文件远程传输工具

一、FileZilla简介 FileZilla是一个快速、免费、跨平台的FTP软件,实用多功能和界面直观的FTP客户端。FileZilla是Windows,Linux,MacOSX等跨平台的图形化FTP,SFTP和FTPS文件管理工具。通过大量直观的工具,FileZilla可以…

Linux Debian11使用国内源安装 Docker 环境

首先切换到root账户: su 一、Debian安装Docker 1.更新并安装一些必要系统工具。 sudo apt-get update sudo apt-get upgrade sudo apt-get install \apt-transport-https \software-properties-common \ca-certificates \curl \gnupg \lsb-release2.安装GPG证书…

计算机网络怎么寻址_计算机网络中的无类寻址

计算机网络怎么寻址To reduce the wastage of IP addresses in blocks we subnetting. But in Classless addressing wastage of IP addresses in a block is more reduced than Classful subnetting. In this variable length, blocks are used that belongs to no class. 为了…

Linux Debian常用下载工具Transmission和qbittorrent

1.Transmission Transmission是Linux Debian系统下的系统自带的一种BitTorrent客户端下载工具,下载速度比较快。在Linux系统可以替代windows上的迅雷下载工具。 2.qbittorrent 使用下面命令安装: sudo apt-get install qbittorrent获取更多资料&#x…

《 面试又翻车了》这次竟然和 Random 有关?

小强最近面试又翻车了,然而令他郁闷的是,这次竟然是栽到了自己经常在用的 Random 上......面试问题既然已经有了 Random 为什么还需要 ThreadLocalRandom?正文Random 是使用最广泛的随机数生成工具了,即使连 Math.random() 的底层…

Linux Debian11使用国内源安装Podman环境

一、Podman简介 Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。 Podman 可…

二叉搜索树中第k大元素_二叉搜索树中第K个最小元素

二叉搜索树中第k大元素Problem statement: 问题陈述: Find the k-th smallest element in a given binary search tree (BST). 在给定的二进制搜索树(BST)中找到第k个最小的元素。 Example: 例: K4Kth smallest element in the above binary tree is:…

阿里巴巴Java开发手册建议设置HashMap的初始容量,但设置多少合适呢?

作者 l Hollis来源 l Hollis(ID:hollischuang)集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。关于HashMap,很多人都对他有一些基本的了解&…

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题,比如驱动程序;后者一般用来分析用户态程序的问题。 一般…

Linux Debian利用Dockefile将Python的py文件项目代码打包为Docker Podman镜像

1.创建PyCharm工程 使用PyCharm创建testHelloWorld工程,如下图所示: 2.选择本项目下的Python解释器 通过File -> Setting…选择解释器为本工程下的Python解释器。 【备注:一定要将项目python环境依赖存至本项目下,默认依赖本…

Java14发布!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!​

Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8,每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本,所以不要慌,我们先来了解一下好了,等 LTS 版本发…

PyCharm更换pip源为国内源、模块安装、PyCharm依赖包导入导出教程

一、更换pip为国内源 1.使用PyCharm创建一个工程 2.通过File -> Setting…选择解释器为本工程下的Python解释器。 3.单击下图中添加“”, 4.单击下图中的“Manage Repositories”按钮, 6.目前国内靠谱的 pip 镜像源有: - 清华&#xff1…

Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!

Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8,每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本,所以不要慌,我们先来了解一下好了,等 LTS 版本发…

在线批量压缩JPG图片-JpegMini

2019独角兽企业重金招聘Python工程师标准>>> 之前有推荐过一个在线批量压缩PNG图片的网站TinyPng,这儿小觉再次推荐一个同类网站,专门在线批量压缩JPG图片的JpegMini。 当然,大家或者会说现在很多工具或者网站都有提供在线批量压缩…

《大厂内部资料》Redis 性能优化的 13 条军规!全网首发

这是我的第 43 篇原创文章。Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1))&#…

Redis 性能优化的 13 条军规!史上最全

Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程…

Linux Debian11 Podman容器常用命令

Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行任何符合 OCI(Open Con…